我有一个需要 20 分钟才能运行的查询,即使我在 where 子句中的每一列都有一个索引,并且每一列都被加入:
SELECT DISTINCT skt.VCDRAWING_REG_NO, skb.NDRAWING_ORG_NO, skb.NDRAWING_ORG_REV_NO, skb.CAPPLY_START_DATE, skb.CAPPLY_END_DATE, skto.*
FROM SPM_ABS_TRANBASE skt
JOIN SPM_ABS_BASE skb
ON skt.NDRAWING_ORG_REV_NO = skb.NDRAWING_ORG_REV_NO
AND skt.NDRAWING_ORG_NO = skb.NDRAWING_ORG_NO
JOIN SPM_ABS_MODEL skm
ON skb.NDRAWING_ORG_REV_NO = skm.NDRAWING_ORG_REV_NO
AND skb.NDRAWING_ORG_NO = skm.NDRAWING_ORG_NO
JOIN SPM_ABS_TRANOPT skto
ON skt.NDRAWING_SYSTEM_NO = skto.NDRAWING_SYSTEM_NO
JOIN ModelImport mi
ON skm.CMODEL = mi.ModelCode
WHERE (skb.CAPPLY_START_DATE <= DATEADD(day, 2, GETDATE()) OR skb.CAPPLY_START_DATE IS NULL)
AND (skb.CAPPLY_END_DATE >= DATEADD(day, -2, GETDATE()) OR skb.CAPPLY_END_DATE IS NULL)
令我困惑的一件事是:如果我添加以下 WHERE 子句,查询会在大约 0.5 秒内返回:
AND mi.ModelCode = '3FBK5'
现在您说,well, duh, of course it gets much faster with that
- 问题是,ModelImport 表只包含 351 条记录。这意味着如果我将上面的查询拆分为 351 个查询,每个查询都有自己的 where 子句用于不同的 ModelCode - 那么我可以在大约 175 秒或 2.9 分钟内获得 100% 的查询结果。这要快得多。这告诉我,开放式查询中的某些东西效率极低,而且查询计划也很糟糕。
这是我添加的查询计划AND mi.ModelCode = '3FBK5'
。
查看我的查询计划后,有什么想法可以加快速度吗?