我有一个非常简单的查询,它给了我意想不到的结果。欢迎提供有关在何处进行故障排除的提示。
简化,查询是:
SELECT Obs.obsDate,
Obs.obsValue,
ObsHead.name
FROM ml.Obs Obs
JOIN ml.ObsHead ObsHead ON ObsHead.hdId = Obs.hdId
WHERE obs.hdId IN (53, 54)
这给了我一个查询成本:963。但是,如果我将查询更改为:
SELECT Obs.obsDate,
Obs.obsValue,
ObsHead.name
FROM ml.Obs Obs
JOIN ml.ObsHead ObsHead ON ObsHead.hdId = Obs.hdId
WHERE ObsHead.name IN ('BP SYSTOLIC', 'BP DIASTOLIC')
尽管它(应该)返回相同的数据,但估计成本会飙升至17688。这里的问题可能出在哪里?谢谢。
编辑:查询计划说索引ObsHead.Name
用于范围扫描,而 ObsHead 上的表访问成本仅为 4。还有另一个索引Obs.hdId
用于范围扫描,成本为 94:它是表之间的嵌套循环连接最高可达 17K。