1

特定の日付範囲のデータを取得する SQL スクリプトを作成しようとしています。以下に示す例では、1 日 (datetime) のみのデータを取得しようとしています。

ただし、クエリの実行が完了するまでに 3 分以上かかります。

Datetime列に作成するインデックスがないかどうかはよくわかりません。はいの場合、この SQL クエリをすばやく実行する方法を教えてください。

クエリ実行プランと統計 IO から添付されたスナップショットも参照してください。

ご助力ありがとうございます。

SQL クエリ

set Statistics IO on
declare @StartDate datetime,@EndDate datetime
set @StartDate = '2012-07-19 00:00:00.000'
set @EndDate = '2012-07-20 23:59:00.000'
select * from Admin_Letters A with (nolock)
Where A.Date_Linked > @StartDate and A.Date_Linked < @EndDate

実行計画のスナップショット

1.

ここに画像の説明を入力

2.

ここに画像の説明を入力

4

1 に答える 1

3

クエリにが含まれているSELECT *と、何かを最適化しようとしてもあまり運がありません。テーブルからすべての列を要求するため、SQL Serverのクエリオプティマイザは、テーブルスキャンの方が速いため、多くの場合、テーブルスキャンを実行します。

また:table scanテーブルにクラスタリングインデックスがないことを意味します->ひどく悪い選択。すべての実際のテーブルに適切なクラスタリングインデックスが必要です。

それができたら(たとえば列に)、そのテーブルから本当に必要なINT IDENTITYを決定する必要があります。非クラスター化インデックスをに配置し、本当に必要なすべての列を含めます-次のようになります。Date_Linked

CREATE NONCLUSTERED INDEX IX01_Admin_Letters
ON dbo.Admin_Letters(Date_Linked)
INCLUDE (Col1, Col2, ..., ColN)   -- as **few** columns as possible!

そして

SELECT Date_Linked, Col1, Col2, ...ColN 
FROM dbo.Admin_Letters A
WHERE A.Date_Linked > @StartDate AND A.Date_Linked < @EndDate

本当に飛ぶでしょう!(SQL Serverのクエリオプティマイザーは、インデックスから数行を選択することを選択できるため、数列のインデックススキャンでさえ、テーブルスキャンよりもはるかに高速になります)

于 2012-07-23T14:38:44.280 に答える