3

SQL Server 2008 を使用しています。

これらの 2 つのクエリが同じような時間 (200 万行以上で約 52 秒) になる理由について、アドバイスが必要です。

クエリ 1:

DBCC DROPCLEANBUFFERS

DECLARE @curr INT
SET @curr = YEAR(GETDATE())

SELECT MAX([Date])
FROM DB_Item
WHERE YEAR([Date]) = @curr

クエリ 2:

DBCC DROPCLEANBUFFERS

SELECT MAX([Date])
FROM DB_Item

Actual Execution Plan を使用すると、 でスキャンされClustered Index scanます。

では、なぜDate1 つのテーブルで の最大値をすばやく取得する別の方法があるのでしょうか?

あなたの助けは非常に高く評価されています。

ありがとう。

4

2 に答える 2

1

実際のデータはクラスター化インデックスの最下位レベルであるため、クラスター化インデックス スキャンはテーブル スキャンです。したがって、この場合、両方のクエリがすべての行を調べています。

したがって、日付列の非クラスター化インデックスは、2 番目のクエリに役立ちます。

この場合、 YEAR は SARGable であるため、最初のクエリにも役立ちます (? これを読んだ場所が見つかりません)。これは SQL Server では非常にまれです。通常、述語列に対する関数は、インデックスが使用されないことを意味します

于 2013-08-20T07:05:59.323 に答える