SQL Server条件流
如果我在
IF EXISTS
条件下写两个SELECT
语句,并且在这些选择查询之间有一个AND
子句,即使第一个SELECT
返回false,两个查询都会被执行吗?
IF EXISTS (SELECT....) AND EXISTS(SELECT ....)
BEGIN
END
在这种情况下,SQL Server引擎是否同时执行SQL语句?
谢谢
Krish
没有找到相关结果
已邀请:
7 个回复
链眷克袒姜
这可以保证此处所述的短路,但这意味着您需要选择最便宜的一个进行预先评估,而不是将其留给优化器。 在我极为有限的测试中,以下似乎在测试时也适用 1.
版本似乎最成问题。这将一些外部半连接链接在一起。在所有情况下都没有重新安排测试的顺序,试图先做更便宜的测试(这个博客文章后半部分讨论的问题)。在
版本中,如果它没有短路,它将没有任何区别。然而,当这个组合谓词被放入一个
条款时,计划会发生变化并且它会短路,因此重新安排可能是有益的。
所有这些的计划看起来非常相似。
版本和
版本之间行为差异的原因是,对于前者,如果条件为假,则正确的行为是不返回结果,因此它只链接
,如果一个为假,则零行携带转到下一个。 但是,
版本总是需要返回1或0的结果。此计划在其外连接中使用探测列,如果未通过
测试(而不是简单地丢弃该行),则将其设置为false。这意味着总有一行进入下一个Join并且它总是被执行。
版本有一个非常相似的计划,但它使用一个
谓词,如果不满足之前的
条件,它用于跳过JOIN的执行。我不确定为什么组合
s不会使用相同的方法。 2.20ѭ
版本使用连接(
)运算符作为外半连接的内部输入。这种安排意味着它可以在第一个返回时立即停止从内侧请求行(即它可以有效地短路)所有4个查询最终得到相同的计划,其中首先评估更便宜的谓词。
3.添加
我确实尝试过De Morgan定律将
转换为
,看看是否有任何区别。转换第一个查询给出
因此,这对短路行为仍然没有任何影响。但是,如果你移除
并颠倒
条件的顺序,它现在会短路!
呕蹿尉
替换第二个条件进行测试,如果没有发生短路,这会给你一个零除错误,如下所示:
如果你不相信,你总是可以重写你的查询来做到这一点:
膏焦凑
蹄渭信妥扳
授巨
给
这是显而易见的,因为优化器知道由于存在主键 - 外键关系,因此如果tbla中缺少该值,则它永远不会出现在tblb中。因此,优化器将决定运行时不需要在tblb上进行搜索。 但是,如果我将查询写为
然后访问这两个表。这很明显,因为优化器知道它必须检查两个位置以确保满足AND条件。 但是,在这两种情况下,实际执行计划都显示了对tbla和tblb的搜索。这对我来说很奇怪。有什么想法吗?
夏瓤跋棘
块。 这很容易测试。 对于你的第一次评估做一些像
和你的第二次做任何事情,然后显示实际的执行计划。在我的作品中,它只进行常数扫描来评估这些常数。
骇毖煽洁铂