【发布时间】:2010-12-01 14:56:13
【问题描述】:
如果我运行这个查询
select user from largetable where largetable.user = 1155
(请注意,我查询用户只是为了将其简化为最简单的情况)
再看执行计划,计划了一次index seek [largetable has an index on user],估计行数是正确的29。
如果我这样做了
select user from largetable where largetable.user = (select user from users where externalid = 100)
[当我硬编码时,子查询的结果是单个值 1155,就像上面一样]
查询优化器估计结果中有 117,000 行。 largetable 中大约有 6,000,000 行,users 中有 1700 行。当我运行查询时,我当然会返回正确的 29 行,尽管估计的行数很大。
我已在相关索引的两个表上使用全扫描更新了统计信息,当我查看统计信息时,它们似乎是正确的。
值得注意的是,对于任何给定用户,largetable 中的行数不超过 3000 行。
那么,为什么估计的执行计划会显示如此大量的估计行?优化器不应该根据统计信息知道它正在寻找具有 29 个对应行的结果,或者即使它不知道子查询将选择哪个用户,它也应该寻找一个 MAXIMUM 为 3,000 行的结果?为什么会有这么大的估计?问题是,这个大估计会影响更大查询中的另一个连接以进行扫描而不是搜索。如果我使用子查询运行较大的查询,则需要 1 分 40 秒。如果使用 1155 硬编码运行它需要 2 秒。这对我来说很不寻常......
谢谢,
克里斯
【问题讨论】:
标签: sql-server performance sql-execution-plan