約束
由於該應用程序是動態構建的,因此我無法在此時更改查詢,並且我們無法在今天,本週甚至本月將代碼推送到PROD。這必須在數據庫中解決。這就是我評估索引的原因。查詢性能,索引和預測覆蓋索引的寫入時間性能命中?
我們在我們的數據庫中有一個表,CaseHistory
,它有〜10MM行。不可怕,但它是一個成長的痛苦。讀取時間開始對從搜索幹這樣的查詢苦:現在
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'
是子1s
而上述查詢13s
和15s
之間運行。
當前指數
IX_CaseHistory (CaseNumber (ASC))
IX_CaseHistory_1 (ActionTypeID (ASC))
IX_CaseHistory_2 (CreationTimeGMT (ASC))
所以,我想要做的是CaseNumber, ActionTypeID, CreationTimeGMT
建立聚集覆蓋索引。目前集羣索引在IDENTITY PK
。
爲什麼要羣集?
因爲我想這個查詢的運行速度太(這是執行1000年代每日次):
select CaseHistoryID
,CaseNumber
,ActionTypeID
,CreationTimeGMT
,UserID
,Notes
from CaseHistory
where CaseNumber = @CaseNumber
order by CreationTimeGMT
不過,我有一個基本的關注,我怎麼能預測什麼樣的命中這將有寫時間?
+1的整潔問題 – SriniV
能否請您添加相關的DB標籤? – SriniV
我們需要查看查詢計劃以評估您的分析。 – Jodrell