データベース内のすべての行に対してバッチ処理を実行しています。これは、すべての単一のモデルを選択し、それに対して何かをすることを含む。これをチャンクに分割し、チャンクでチャンクします。Django QuerySetを使用してデータベースをチャンクで処理する最も良い方法は?
私は現在Paginatorを使用しています。便利です。これは、順番にページできるように、値の順序付けが必要であることを意味します。これはorder
とlimit
句を持つSQL文を生成し、各チャンクについてはPostgresがテーブル全体をソートしている可能性があると思います(ただし、内部についての知識はありません)。私が知っていることは、データベースが約50%のCPUにあるということです。それはちょうどselect
を実行するには高すぎると思います。
RDMBS/CPUに優しい方法でテーブル全体を反復処理する最良の方法は何ですか?
データベースの内容がバッチ操作中に変更されないと仮定します。
これはレコードが 'sort'句を使用せずに同じ順序で返されることを想定しています。これは正しいです?また、私が 'Meta'クラスにデフォルトのソートをしていれば、何とかそれをクエリ用に削除できますか? – Joe
@ Joe:基本的に同じレコードを取得しますが、ソートされません。あなたのID空間に隙間がある場合、返されるレコードの数は、すべての呼び出しで予想よりも少なくなる可能性があります。 LIMIT/OFFSETではソートされた行数が固定数になります(テーブルごとの最後の呼び出しを除く)。私は 'Meta'クラスを扱う方法はありませんが、LIMIT/OFFSETの行を並べ替える必要があります。 –
アーウィン、本当に申し訳ありませんが、私はあなたの答えを正しく読まなかった。これがより速いと確信していますか? 'between'節はIDが既にソートされている場合、または毎回全テーブルスキャンを実行する場合にのみ確実に機能します。 – Joe