2

データベースの第一人者は、クエリのリファクタリングを提案しています。

SELECT * FROM MyTable 
WHERE UnIndexedDate 
BETWEEN '2012-08-01' AND '2012-09-01'

SELECT * FROM MyTable
WHERE IndexedID 
BETWEEN (SELECT MIN(IndexedID) FROM MyTable WHERE UnIndexedDate BETWEEN '2012-08-01' AND  '2012-08-30')
AND (SELECT MAX(IndexedID) FROM MyTable WHERE UnIndexedDate BETWEEN '2012-08-01' AND  '2012-08-30')

テーブルは列にインデックス付けされていませんが、UnIndexedDate列にインデックス付けされていることに注意してくださいIndexedID。このテーブルには、数百万のレコードが含まれています。

これは明らかにクエリの速度を向上させます。サブクエリは1回だけ実行され、インデックス付きフィールドが含まれるため、何らかの方法ではるかに効率的になる可能性があるためだと思います。

私の質問は、これは一般的にほとんどのデータベースに当てはまるのか、それともここではSQL2000データベースだけに当てはまるのかということです。

追加:ところで、IndexedIDは数値であり、一意であり、厳密に増加しています。

4

1 に答える 1

0

最適化は、インデックス付けされていない日付列がインデックス付けされたID列と組み合わせて増加する場合にのみ機能します。これは、DESIGNの前提であり、それが実行されるプラットフォームの前提ではありません。つまり、IDは挿入時に挿入される自動番号であり、インデックスなしの日付は挿入時であるため、インデックスなしの日付はインデックス付きのIDと相関しているように聞こえます。その狭いケースでは、@MartinSmithのコメントが当てはまります。インデックス付けされていない日付列とインデックス付けされた列に相関関係がない場合、結果が異なる場合があります。

実行プランを見ずに、ID(非常に狭くて小さいデータセット)を取得するためにテーブル上で2つのスキャンが表示され、インデックスが実際の行を返そうとしていることは間違いありません。想定される関係が成り立つ限り、それは機能します。ただし、誰かが日付列として更新した場合(および日付とIDの関係が壊れた場合)、MINまたはMAX id値が範囲内にない可能性があるため、結果は正確ではなくなります。

于 2012-10-17T12:33:01.300 に答える