上下文:SQL Server 2008.内部连接有2个表。 拥有4000万行的事实表包含患者密钥和所服用的药物以及其他事实。药物密钥和患者密钥在该顺序中有一个独特的索引(非聚集)。 维度表是药物清单(70行)。 加入是基于药物密钥(代理键)获得药物代码(商业代码)。 查询:SQL Server查询的奇怪执行计划
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? –