2012-01-05 59 views
0

我正在調查索引,並通讀了很多文章,希望得到一些專家的建議。作爲一個警告,索引字段對我來說是相當新的,即使在閱讀了這個主題後也有點混亂!SQL Server 2005 - updt_tmstmp字段索引

爲了簡化,我有一個包含guid(事務ID),事件ID和updt_tmstmp(有許多其他字段但對此問題不重要)的表。

我的PK是transaction_id和event_id,表格是按這些鍵排序的。由於transaction_id是一個GUID,所以updt_tmstmp字段非常隨機。隨着表格增長到600萬條記錄,查詢速度減慢。我的想法是在updt_tmstmp字段中添加一個索引。我們的提取經常在桌面上搜索,並查找過去24小時內有更新的transaction_id。查詢正在掃描整個表以查找已更新的記錄。平均1分鐘時間

詳情當前: 工作臺尺寸:620萬條記錄 指數:TRANSACTION_ID +事項標識(羣集)

詳細嘗試: 其他指數:updt_tmstmp(非唯一,非羣集)

當我做了這個更新,並運行查詢它改善了大約10%和解釋計劃表明我仍然表掃描索引。我預計性能會比這更好一點。我的updt_tmstmp不保證是唯一的(我責怪應用程序員這樣做:))。

我用來訪問它的查詢是一個標準的start_time - end_time。 updt_tmstmp> = @start_time和updt_tmstmp < @end_time

在此先感謝您,祝您有美好的一天!

克里斯

回答

0

問:鑑於事項標識一個聚集索引,並在TRANSACTION_ID和updt_tmstmp non_clustered指標,我想提出以下建議:

- 砸事項標識的聚集索引和非聚集索引在updt_tmstmp上。
- 在updt_tmstmp上創建聚簇索引。

邏輯:SQL Server查詢優化器一直傾向於使用非聚簇索引的聚簇索引。查詢最喜歡的showplan顯示使用event_id作爲聚簇索引時的聚簇索引SCAN。通過將聚集索引移動到updt-tmstmp,查詢showplan應顯示在過去24小時內的所有事務的範圍搜索,並應儘快執行,因爲集羣密鑰已排序並且在物理上與磁盤相鄰...對於範圍掃描羣集。

通過這樣做,您將完成一些關鍵的設計目標。

定義的是非常有選擇性的或包含許多不同的值

儘可能少的列有一個可能,考慮列的聚集索引鍵 - 同時...的UPDT-tmpstmp現場數據將被順序訪問並且很少如果根本不更新。非常適合聚集索引。 updt-tmstmp字段將經常用於對從表中檢索的數據進行排序。

我建議您在查詢前使用以下內容來幫助您理解查詢優化行爲。

組統計IO ON 去 組統計時間 去

表 的表的名稱。

掃描次數 執行的索引或表掃描次數。

邏輯讀取 從數據緩存中讀取的頁數。

物理讀取 從磁盤讀取的頁數。

預先讀取 放入查詢緩存的頁數。

lob邏輯讀取 從數據高速緩存中讀取的文本,ntext,圖像或大值類型(varchar(max),nvarchar(max),varbinary(max))頁的數量。

lob物理讀取 從磁盤讀取的文本,ntext,圖像或大值類型頁的數量。

lob read-ahead reads 放入查詢緩存中的文本,ntext,圖像或大值類型頁面的數量。

SQL Server分析和編譯經過時間和CPU

SQL Server的執行時間和CPU