簡體   English   中英

為什么 SQL 服務器不使用我的聚集索引並進行非聚集索引掃描?

[英]Why isn't SQL Server using my clustered index and doing a non-clustered index scan?

我有一個有幾列的patient表,列ID上有一個聚簇索引, birth列上有一個非聚簇索引。

create clustered index CI_patient on dbo.patient (ID)
create nonclustered index NCI_patient on dbo.patient (birth)

這是我的查詢:

select * from patient 

select ID from patient

select birth from patient 

看執行計划,第一個查詢是'clustered index scan'(可以理解,因為表是聚表),第三個是'index scan nonclustered'(也可以理解,因為該列有非聚簇索引)

我的問題是為什么第二個是“索引掃描非聚集”? 這個列假設有一個聚集索引,從這個意義上說,應該是聚集索引掃描嗎? 對此有什么想法嗎?

詢問

基本上,您的第二個查詢想要從表中獲取所有ID值(沒有WHERE子句或任何東西)。

SQL 服務器可以通過兩種方式做到這一點:

  • 聚集索引掃描——基本上是全表掃描,從所有行中讀取所有數據,並從每一行中提取ID可以工作,但它會一個接一個地加載整個表
  • 對非聚集索引進行掃描,因為每個非聚集索引包括其葉級別的聚集列。 由於這是一個比全表小得多的索引,要做到這一點,SQL 服務器將需要加載更少的數據頁,因此可以提供答案 - 所有行的所有ID值 - 比進行全表掃描時更快(聚集索引掃描)

SQL 服務器中基於成本的優化器只是選擇更有效的途徑來獲得您在第二個查詢中提出的問題的答案。

暫無
暫無

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

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