簡體   English   中英

索引掃描,索引查找和表掃描

[英]Index scan, Index seek and table scan

我有以下表格:

Create table Tab_with_Ix
(
    id int not null,
    name nvarchar(10),
    phone decimal(10,0)
)

我插入了一些記錄:

insert into Tab_with_Ix 
values(1, 'Yogesh', 8855664452), (2, 'Vinay', 9977884455), (3, 'Sam', 9988554466)

現在,我在Tab_with_Ix上創建一個非聚集索引:

CREATE NONCLUSTERED INDEX NCI_Ix on Tab_with_Ix(id)

現在,當我查詢Tab_with_Ix

Select * 
from Tab_with_Ix
where id = 1

我得到一個執行計划:

在此輸入圖像描述

但是,當我使用以下查詢時:

Select id 
from Tab_with_Ix 
where id = 1

我得到一個執行計划:

在此輸入圖像描述

我的問題是:為什么SQL Server一次使用表掃描,另一次,索引搜索?

如果您執行SELECT * - 您想要所有列 - 所以最后,SQL Server必須返回基表數據。 在這種情況下,通常使用昂貴的密鑰查找(或RID查找,如果不存在聚簇索引)進行表掃描(或聚簇索引掃描)而不是索引查找更便宜。

如果你有很多行,那么在某些時候SQL Server可以更有效地進行索引掃描和單個(或幾個)鍵/ RID查找 - 所以如果你的樣本表中有數千行 - 在某些時候(“臨界點”),SQL Server將開始使用您的非聚集索引。

在第二種情況下,當您執行SELECT id ,您只需要id列 - 並且該列位於索引頁中 - 因此對該索引的索引搜索將為SQL Server提供滿足此查詢所需的所有內容 - 因此,索引搜索通常要快得多,並且優先於表掃描。

這是為什么你應盡量避免使用SELECT * FROM dbo.Table眾多原因之一。 使用SELECT * ,通常不使用非聚簇索引,而是使用表(或聚簇索引)掃描。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM