2013年12月19日 星期四

Django的delete signals與database存取次數的問題

在Django中,signals這個系統可以很方便的讓我們在不同的app中去listen其他系統發生的事件,透過預先定義好的signal,傳遞指定的變數與資料,降低app間的耦合性,應用在log等等的系統上,可以避免在code中引入其他的系統,插入與該系統相關的程式碼。

不過在今天測試的過程中發現,當listen特定的model的pre_delete事件時,刪除整個QuerySet會造成多一次的SELECT query。翻閱Django的文件後發現有下列的提醒在:
The delete() method does a bulk delete and does not call any delete() methods on your models. It does, however, emit the pre_delete and post_delete signals for all deleted objects (including cascaded deletions).
Django needs to fetch objects into memory to send signals and handle cascades. However, if there are no cascades and no signals, then Django may take a fast-path and delete objects without fetching into memory. For large deletes this can result in significantly reduced memory usage. The amount of executed queries can be reduced, too.[1]
看來是應該要考慮一下是否當用戶刪除資料時也要做對映的log,系統中目前做刪除log的model中,有一個欄位還必需去取被刪除model的外鍵,若是刪除10筆就多10個Query,目前尚無好的解決方式。

參看:
  1. Django documentation

沒有留言:

張貼留言