2010-10-16 94 views
3

我在表中有2.7億條記錄。目前,我在日期列中有一個非聚集索引。 99%的時間我使用日期> 1/1/2008行,這意味着1.4億行。 我正在使用SQL Server 2008.在這種情況下,使用非正常非聚集索引以外的篩選索引會有好處嗎?已過濾索引與正常非聚簇索引

此外,如果我使用「日期」數據類型而不是「日期時間」它有多好處?

在此先感謝!

回答

4

是,過濾後的非聚集索引將用於:

  • 查詢比掃描非常非常少的記錄,例如。有WHERE date ='20101016'(過濾掉一天,270M的記錄很少)。
  • 查詢比掃描日期範圍較大,但觸摸日期字段:SELECT COUNT(date) FROM ... WHERE date BETWEEN '20080101' AND '20090101'

而且僅此而已。任何更復雜的查詢將而不是使用非聚集索引,過濾或不過濾,因爲它會擊中index tipping point

所以在最後,對於一般的查詢,在該表上有一個WHERE date > '200080101'條款你提出的過濾非聚集索引將幫助...... 什麼。此外,即使您將date作爲聚簇索引最左邊的鍵(這是典型的時間範圍查詢時間序列組織,例如您的表似乎是,並且您應該自己考慮它),將'only'140M過濾掉270M幾乎不是優化。

適當的索引是一個複雜的主題。我強烈建議您在本MSDN鏈接中閱讀的所有內容,其中包括所有子章節:Designing Indexes。這會給你最基本的知識去理解一些更復雜的文章,並且能夠從大量的錯誤信息中辨別出正確的答案。

1

是的,過濾後的索引可能會有幫助。如果你有一個通用的過濾器,例如「WHERE MyColumn IS NOT NULL」來獲得1.4億行,那麼這可能是創建索引的方式。該索引將使用與標準相匹配的密鑰來構建,這使得索引數據的集合更小。

當您處理大量數據時,日期鍵(3字節存儲)也可能比日期時間(8字節存儲)更好。但是,如果您不需要從日期時間數據類型獲得的精度(時間),它只會有所幫助。

+0

此列不爲空。它是多麼有益..?任何想法 ?我的意思是我可以獲得多少時間。我需要定量分析。 – Relativity 2010-10-16 00:51:16

+0

您可以使用任何有效的條件來定義過濾後的索引。例如,您可以基於「MyDateColumn>'1/1/2009'」創建已過濾的索引,並且只會爲日期大於該日期的數據編制索引。因此,在確定是否使用過濾索引時,可空性並不重要。 – bobs 2010-10-16 00:53:24

+0

重要的是,您創建對於您將要運行的查詢有用的索引。你提到的每一點都很重要,你必須用這些查詢來評估每個索引選項。 – bobs 2010-10-16 00:57:14