統計數據是SQL Server用來確定如何獲取數據的可行性。
比方說,你有一個只有主鍵上有聚集索引的表。當您執行SELECT * FROM tablename WHERE col1=value
時,SQL Server只有一個選項,用於掃描表中的每一行以查找匹配的行。
現在我們在col1上添加一個索引,以便您假定SQL Server將使用索引來查找匹配的行,但事實並非如此。假設表格有200,000行,col1
只有2個值:1和0.當SQL Server使用索引查找數據時,索引包含指向聚簇索引位置的指針。鑑於索引列中只有兩個值,SQL Server認爲只需掃描表是更合理的,因爲使用索引會更有效。
現在我們再向表中添加800,000行數據,但是這次col1
中的值差別很大。現在這是一個有用的索引,因爲SQL Server可以可靠地使用索引來限制它需要從表中提取的內容。 SQL Server會使用索引嗎?
這取決於。統計數據依賴於什麼。在某個時間點,設置AUTO UPDATE STATISTICS
,服務器將更新索引的統計信息,並知道這是一個非常好的有效索引。然而,在那之前,它會忽視索引作爲不相關的。
這是統計的一種用法。但還有另外一種用途,那與指數無關。 SQL Server保留有關表中所有列的基本統計信息。如果有足夠的不同數據使其值得,那麼SQL Server實際上會在列上創建一個臨時索引並用它來過濾。雖然這比使用現有索引需要更多的時間,但比全表掃描花費的時間更少。
有時,您會得到建議以創建對該列有用的列的特定統計信息。這些不是索引,但是會跟蹤列中數據的統計抽樣,因此SQL Server可以確定創建臨時索引以返回數據是否合理。
HTH
「服務器將更新索引的統計信息,並知道這是用一個非常良好的,有效的指標」 - 依據是什麼?何時該索引被確定爲無效使用? – BornToCode 2016-06-19 10:09:18