制約
クエリはアプリケーションによって動的に構築されているため、現時点では変更できません。また、今日、今週、または今月でさえ、コードを修正して PROD にプッシュすることはできません。これは、データベースで解決する必要があります。それが私がインデックスを評価している理由です。
データベースにはCaseHistory
、約 1,000 万行のテーブルがあります。ひどくはありませんが、成長痛です。次のような検索に起因するクエリでは、読み取り時間が長くなり始めています。
select CaseNumber
,isnull(
(
select convert(varchar,min(CreationTimeGMT),101)
from CaseHistory
where CaseNumber = c.CaseNumber
and ActionTypeID = 1
), 'N/A'
) as CreationTimeGMT
...
from [Case] c
where CaseNumber in (
select CaseNumber from CaseHistory
where ActionTypeID <> 1 and
CreationTimeGMT >= '10/25/2013'
) AND
CaseNumber in (
select CaseNumber from CaseHistory
where ActionTypeID <> 1 and
CreationTimeGMT <= '10/25/2013'
)
さて、一見、取得するCreateionTimeGMT
サブクエリが問題かと思われるかもしれませんが、実行計画を分析したのでそうは思いません。このクエリの実行計画では、SEEK
に対して処理の 99% が使用されましたIX_CaseHistory_1
(下の [現在のインデックス] に表示)。CaseNumber
サブクエリであるとは思わない理由をさらに具体的にするために、次のように に対して直接検索します。
select CaseNumber
,isnull(
(
select convert(varchar,min(CreationTimeGMT),101)
from CaseHistory
where CaseNumber = c.CaseNumber
and ActionTypeID = 1
), 'N/A'
) as CreationTimeGMT
...
from [Case] c
where CaseNumber = '123456'
はsub 1s
ですが、前述のクエリは ~ の間13s
で実行されます15s
。
現在のインデックス
IX_CaseHistory (CaseNumber (ASC))
IX_CaseHistory_1 (ActionTypeID (ASC))
IX_CaseHistory_2 (CreationTimeGMT (ASC))
だから、私がしたいのは、クラスター化されたカバーされたインデックスを構築することCaseNumber, ActionTypeID, CreationTimeGMT
です。現在、クラスター化インデックスは にありIDENTITY PK
ます。
なぜクラスター化したのですか?
このクエリも高速に実行したいので (1 日に 1,000 回実行されます):
select CaseHistoryID
,CaseNumber
,ActionTypeID
,CreationTimeGMT
,UserID
,Notes
from CaseHistory
where CaseNumber = @CaseNumber
order by CreationTimeGMT
ただし、基本的な懸念事項が 1 つあります。これが書き込み時間にどのような影響を与えるかをどのように予測できますか?