【发布时间】:2011-08-23 18:50:53
【问题描述】:
上下文:SQL Server 2008。内部连接有 2 个表。 事实表有 4000 万行,包含患者键和所用药物以及其他事实。药物键和患者键按该顺序组合有一个唯一索引(非聚集)。 维度表是药物清单(70 行)。 加入是根据用药键(代理键)获取用药码(业务码)。 查询:
SELECT a.PKey, a.SomeFact, b.MCode
FROM tblFact a
JOIN tblDIM b ON a.MKey = b.MKey
所有返回的列都是整数。 上述查询在 7 分钟内运行,其执行计划显示使用了 (MKey,PKey) 上的索引。索引在运行前重建。 当我禁用事实表上的索引(或将数据复制到具有相同结构但没有索引的新表)时,相同的查询只需要 1:40 分钟。
IO 统计数据也令人惊叹。
带索引:表'tblFACT'。扫描计数 70,逻辑读取 190296338,物理读取 685138,预读读取 98713
没有索引:表 'tblFACT_copy'。扫描计数 17,逻辑读取 468891,物理读取 0,预读读取 419768
问题:为什么它会尝试使用索引并沿着低效路径走下去?
【问题讨论】:
-
我们能看到索引定义和执行计划吗?它是否必须对您的索引执行 RID_LOOKUP?
标签: sql-server indexing sql-execution-plan