我需要创建一个具有某些条件的视图,然后我需要使用视图,但在我已在视图中应用的视图上应用相同的条件。这是我正在使用的特殊工具所必需的。
我的问题是:SQL Server优化器是否认识到相同的条件被应用了两次并消除了第二个条件或不是总是?
示例:
create view ViewXYZ
as
select x, y, z
from tableXYZ
where x > 0 and y = 'blabla' and z = 1000
创建视图时,我想像这样使用它:
select x, y, z
from ViewXYZ
where x > 0 and y = 'blabla' and z = 1000
答案 0 :(得分:3)
是的,条件是deterministic。对于非确定性谓词,消除它们将是一个错误。
但这完全无关紧要。 SQL性能来自访问路径(即索引),而不是来自表达式的评估。
答案 1 :(得分:1)
问题的答案是肯定的,它只是接受视图的查询,然后对它们应用条件(在视图中给出),这意味着你给出两次相同的条件,因此性能明智无变化
答案 2 :(得分:1)
查询被优化为整个结构,视图定义有效地扩展为外部查询作为一种宏。
优化器能够识别矛盾 - 例如一个WHERE
子句声明X > 10 AND X < 5
被优化为不执行任何表访问,我希望优化器也能够识别两个谓词中较强的一个(例如X > 10 AND X > 20
应该忽略第一个谓词),但我不能指出任何具体的文件。
请记住,优化器尽可能地将谓词尽可能地推向查询的深处。所以通常它们在索引的搜索/扫描期间几乎是免费的,这将导致(相对)高的I / O成本无论如何。