假设我需要从myTab中更新luTab,如下所示
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是唯一的,因此它被迫沿着速度慢得多的流聚合嵌套循环路由。
发布于 2009-12-18 10:54:46
我已经创建了您的表,只加载了几条记录(大约50条查找,15条在myTab中)。
然后我尝试了各种索引选项。luTab的指数寻求总是有29%的成本。
有趣的一点是,如果将LookupValue列添加到luTab上的索引中,则执行计划将显示索引查找之后的两个额外步骤:流、聚合和断言。虽然成本是0%,但随着更多数据的增加,这一数字可能会上升。
我还在idLookup上尝试了一个非聚集索引,并将LookupValue作为一个“包含列”。这样,就不需要访问数据页来检索该列。对于您来说,这可能是一个选项,尽管执行计划没有显示任何不同的内容(但它们也没有Stream聚合/断言)。
-Krip
https://stackoverflow.com/questions/1927399
复制相似问题