首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >覆盖由聚集索引唯一确定的额外列时的索引

覆盖由聚集索引唯一确定的额外列时的索引
EN

Stack Overflow用户
提问于 2009-12-18 10:21:21
回答 2查看 170关注 0票数 0

假设我需要从myTab中更新luTab,如下所示

代码语言:javascript
运行
复制
update myTab
  set LookupVale = (select LookupValue from luTab B
                                       where B.idLookup = myTab.idLookup)

luTab由2列组成(idLookup(唯一),LookupValue)

哪个更好:在idLookup上是唯一的聚集索引,还是idLookup和Lookupvalue相结合的聚集索引?在这种情况下,覆盖指数会有什么不同吗?

(我主要对SQL server感兴趣)

结语:

下面我使用myTab中的27M行,luTab中的150万行跟踪Krips测试。关键的部分似乎是指数的独特性。如果索引指定为唯一索引,则更新将使用哈希表。如果它没有被指定为唯一的,那么更新首先由idLookup ( Stream )生成idLookup,然后使用一个嵌套循环。这要慢得多。当我使用扩展索引时,SQL现在不再被认为LookupValue是唯一的,因此它被迫沿着速度慢得多的流聚合嵌套循环路由。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-18 10:54:46

我已经创建了您的表,只加载了几条记录(大约50条查找,15条在myTab中)。

然后我尝试了各种索引选项。luTab的指数寻求总是有29%的成本。

有趣的一点是,如果将LookupValue列添加到luTab上的索引中,则执行计划将显示索引查找之后的两个额外步骤:流、聚合和断言。虽然成本是0%,但随着更多数据的增加,这一数字可能会上升。

我还在idLookup上尝试了一个非聚集索引,并将LookupValue作为一个“包含列”。这样,就不需要访问数据页来检索该列。对于您来说,这可能是一个选项,尽管执行计划没有显示任何不同的内容(但它们也没有Stream聚合/断言)。

-Krip

票数 1
EN

Stack Overflow用户

发布于 2009-12-18 10:53:33

首先:

覆盖索引总是non-clustered

  • You,应该始终有一个PK和一个聚集索引(在Server上默认情况下是相同的)

这两个概念是分开的。

所以:

您的PK (集群)将是(LookupValue),如果这唯一地标识了行

  • ,覆盖索引将是( idLookup )包括idLookup

然而:

  • idLookup是PK (聚集的),因此不需要覆盖索引
  • 聚集索引(PK)根据聚集索引的性质(简单地说,索引是最低级别的数据)

是隐式“覆盖”的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1927399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档