J.D*_*.D. 5 index sql-server nonclustered-index sql-server-2016 bookmark-lookup
非聚集索引是否固有地在表上存储对主键的引用,以便它可以根据需要进行键查找?...如果是这样,将主键指定为包含列的性能是否会降低或更高创建非聚集索引?
附带问题,为什么非聚集索引默认存储主键而不是聚集索引字段来对表进行键查找?...在主键不是聚集索引的情况下,是不是更慢为了进行键查找,而如果它存储了聚集索引,它可以以这种方式进行查找吗?
Mar*_*ith 12
非聚集索引包含一个回到基表的行定位符。
这是具有聚集索引或堆的物理 RID(文件/页/槽)的行存储表的聚集索引键。
所以你的问题中假设它使用主键的部分(如果它们不同)是没有实际意义的。
行定位符被添加到非唯一非聚集索引的键中,并作为包含列到声明为唯一的非聚集索引。
为这种included
情况明确指定这一点没有性能优势。对于隐式添加到键的情况,如果您的查询将受益于与隐式不同的asc
/desc
方向或多列排序,您可能需要显式执行此操作。
对于不熟悉隐式行为的开发人员,或者如果您的查询仍然需要索引中的那些列,您可能更愿意对其进行明确说明,以便您的代码具有可读性,即使聚簇索引定义将来会发生变化。
关于评论中的后续问题
这是否意味着如果主键在选择列表中,可以从主键的非聚集索引执行键查找(当主键不是聚集索引时)?
是的,你可以在下面看到这一点。
CREATE TABLE #T
(
PK INT PRIMARY KEY NONCLUSTERED,
CI INT INDEX CIX CLUSTERED,
OtherCol INT INDEX NCIX NONCLUSTERED
)
SELECT *
FROM #T WITH (FORCESEEK)
WHERE OtherCol = 10
Run Code Online (Sandbox Code Playgroud)
NCIX
是Uniq1001, CI, OtherCol
CI, Uniq1001
然后查找使用的值来查找聚集索引...PK
是从该查找中返回的。如果您想知道Uniq1001
这是系统静默添加的聚集索引键的一部分,以充当唯一标识符,因为聚集索引未声明为唯一。它是空的,除了值存在/存在重复的行CI
。
归档时间: |
|
查看次数: |
289 次 |
最近记录: |