2011-09-08 96 views
2

我在SQL Server中創建一個簡單的表:試圖瞭解SQL執行計劃

MemberId INT PRIMARY KEY Identity 
Name NVARCHAR(100) NULL 
Description NVARCHAR(250) NULL 

已添加了一個聚集索引,當我創建成員Id作爲主鍵的唯一指標。我沒有爲名稱或說明添加索引。

我增加大約30,000行測試數據表中,並做了以下查詢:

SELECT * FROM Members WHERE Name = 'Foo' 

執行計劃表示如下:

Clustered Index Scan - cost 100% 

這是如何聚集索引掃描?我不預測聚集索引。我認爲這將是更多的表掃描。誰可以給我解釋一下這個?如果不這樣做會導致表掃描到底是什麼?

+0

通常的要求是,你應該嘗試在該列上創建一個具有非聚集索引的相同表格,用相同的30,000行填充它,然後對每個表格運行查詢,並比較這些計劃。你應該看到一個非聚集索引seek,它應該更有效率(對於這個查詢,至少)。 –

回答

5

如果表具有聚簇索引,則clustered index scan與全表掃描相同。聚簇索引本身包含所有數據。

+0

因此,如果您的表有很多行,那麼聚簇索引掃描的性能不好?如果我有五千萬行並運行這個查詢,它可能表現很差?我將如何修改這個表/查詢,以便我能夠看到表中的好奇心? – Travis

+0

當然,如果你沒有'name'列上的索引,它會掃描所有的行。 – a1ex07

+0

我相信你需要刪除pk約束,然後pk,然後創建pk爲非羣集。所以你會有堆表,'聚簇索引掃描'將變成'表掃描'。 – a1ex07

1

,如果你有這個

MemberId INT PRIMARY KEY NONCLUSTERED IDENTITY

改變你的主鍵聲明中,你會發現表掃描直到沒有聚集索引。創建聚集索引後,您的表結構將會發生變化,並由您的聚簇索引鍵在物理上進行排序。我認爲表掃描並不意味着之後,並用聚簇索引掃描代替。只要沒有有用的索引被發現覆蓋在另一個詞表掃描查詢

唯一有意義時表數據不聚集。如果按名稱搜索將是一個存儲爲heap structure

What's the difference between a Table Scan and a Clustered Index Scan?

+0

從什麼時候開始堆砌最佳實踐?聚簇索引掃描是一次表掃描。 – gbn

+1

這不是最好的做法。他試圖理解sql執行計劃,並且正在尋找缺少的表掃描。我認爲這對他能夠找到表掃描很有幫助, –