T-SQL 视图是 "optimized" 但我不明白为什么
T-SQL view is "optimized" but I don't understand why
在 TSQL 中创建视图时,我遇到了某种自动优化问题。
使用设计器和使用 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...
的值
提前致谢。
视觉设计师永远不会尝试优化您的代码。
除非您准备好忍受它们以这种方式破坏您的格式并重写您的查询,否则不要使用它们。
SQL 服务器在任何情况下都不保证短路评估,但这种类型的重写肯定会成为一种悲观情绪。特别是如果其中一个谓词涉及子查询,重写的形式最终可能会更加昂贵。
大概重写的原因只是为了可以轻松地将它们显示在网格中并允许编辑各个网格交叉点处的点 - 或者您可以 select 整列并删除。
在 TSQL 中创建视图时,我遇到了某种自动优化问题。 使用设计器和使用 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...
的值提前致谢。
视觉设计师永远不会尝试优化您的代码。
除非您准备好忍受它们以这种方式破坏您的格式并重写您的查询,否则不要使用它们。
SQL 服务器在任何情况下都不保证短路评估,但这种类型的重写肯定会成为一种悲观情绪。特别是如果其中一个谓词涉及子查询,重写的形式最终可能会更加昂贵。
大概重写的原因只是为了可以轻松地将它们显示在网格中并允许编辑各个网格交叉点处的点 - 或者您可以 select 整列并删除。