9 index sql-server sql-server-2008-r2
两个表具有相同的结构,每个表中有 19972 行。为了练习索引,我创建了两个具有相同结构的表并创建了
clustered index on persontb(BusinessEntityID)
Run Code Online (Sandbox Code Playgroud)
和
nonclustered index on Persontb_NC(BusinessEntityId)
Run Code Online (Sandbox Code Playgroud)
和表结构
BusinessEntityID int
FirstName varchar(100)
LastName varchar(100)
-- Nonclusted key on businessentityid takes 38%
SELECT BusinessEntityId from Persontb_NC
WHERE businessentityid BETWEEN 400 AND 4000
-- CLustered key businessentityid takes 62%
SELECT BusinessEntityId from persontb
WHERE businessentityid BETWEEN 400 AND 4000
Run Code Online (Sandbox Code Playgroud)
为什么聚集索引占 62%,非聚集索引占 38%?
Mar*_*ith 10
是的,聚集索引每页的行数少于非聚集索引,因为聚集索引的叶页必须存储其他两列(FirstName
和LastName
)的值。
NCI 的叶页仅存储值BusinessEntityId
和行定位符(如果表是堆,则为 RID,否则为 CI 键)。
因此,估计成本反映了更大的读取次数和 IO 要求。
如果您将 NCI 声明为
nonclustered index on Persontb_NC(BusinessEntityId) INCLUDE (FirstName, LastName)
Run Code Online (Sandbox Code Playgroud)
那么它将类似于聚集索引。
小智 5
聚集索引不仅包含来自索引所在列的数据,还包含来自所有其他列的数据。(每张表只能有一个聚集索引)
非聚集索引仅包含来自索引列的数据,以及指向其余数据所在位置的 row_id 指针。
因此,这个特定的非聚集索引更轻,扫描/查找所需的读取更少,并且这个特定的查询将更快地工作。
但是,您是否也尝试过检索 FirstName 和 LastName,结果会有所不同,聚集索引的性能应该会更好。
归档时间: |
|
查看次数: |
23713 次 |
最近记录: |