在TSQL中创建视图时,我正在努力进行某种自动优化。 在使用Designer和使用CREATE VIEW时都进行了优化。
输出相同,但我不明白为什么会这样做。
任何人都可以解释一下为什么这是优化的/为什么较低的一个更好:
[...]
WHERE
today.statusId = 7
AND yesterday.cardId IS NULL
AND NOT (
today.name LIKE 'TEST_%'
AND today.department LIKE 'T_%'
)
优化到以下
[...]
WHERE (
today.statusId = 7
AND yesterday.cardId IS NULL
AND NOT (today.name LIKE 'TEST_%')
)
OR (
today.statusId = 7
AND yesterday.cardId IS NULL
AND NOT (today.department LIKE 'T_%')
)
第二个where子句是否强制视图检查 statusId 和 cardId 两次,无论它们的值是多少?虽然第一个允许它在 statusId 为6(例如)时立即中止
同样在第一个中,只要一个值为FALSE,括号部分就可以中止。
当内括号包含20个值时,此行为也不会更改。优化器将创建20个块,一遍又一遍地检查 statusId 和 cardId 的值......
提前致谢。
答案 0 :(得分:1)
视觉设计师不会尝试优化您的代码。
不要使用它们,除非你准备忍受它们破坏你的格式并以这种方式重写你的查询。
在任何情况下,SQL Server都不保证短路评估,但肯定这种类型的重写可以充当悲观情绪。特别是如果其中一个谓词涉及子查询,则重写的表单可能会显得更加昂贵。
据推测,重写的原因只是它可以在网格中轻松呈现它们并允许在各个网格交叉处编辑点 - 或者您可以选择整个列并删除。