我有以下 SQL:
IF EXISTS
(
SELECT
1
FROM
SomeTable T1
WHERE
SomeField = 1
AND SomeOtherField = 1
AND NOT EXISTS(SELECT 1 FROM SomeOtherTable T2 WHERE T2.KeyField = T1.KeyField)
)
RAISERROR ('Blech.', 16, 1)
该SomeTable
表大约有 200,000 行,并且该SomeOtherTable
表的行数大致相同。
如果我执行内部 SQL (the SELECT
),它会在亚秒时间内执行,不会返回任何行。但是,如果我执行整个脚本 ( IF...RAISERROR
),则需要一个多小时。为什么?
现在,显然,执行计划是不同的——我可以在企业管理器中看到——但同样,为什么?
我可能会做类似SELECT @num = COUNT(*) WHERE
......然后IF @num > 0 RAISERROR
但是......我认为这有点忽略了这一点。如果您知道它存在,您只能围绕一个错误(而且它在我看来确实像一个错误)进行编码。
编辑:
我应该提一下,我已经尝试按照@Bohemian 的回答将查询重新组合到 OUTER JOIN 中,但这对执行时间没有影响。
编辑 2:
我附上了内部SELECT
语句的查询计划:
...以及整个IF...RAISERROR
块的查询计划:
显然,这些显示了真实的表/字段名称,但除此之外,查询完全如上所示。