Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL Server';s查询优化器针对自身加入表?_Sql_Sql Server_Performance - Fatal编程技术网

为什么SQL Server';s查询优化器针对自身加入表?

为什么SQL Server';s查询优化器针对自身加入表?,sql,sql-server,performance,Sql,Sql Server,Performance,我正在写一个报告,需要从我无权修改的视图中提取数据。该视图缺少报表所需的列,因此我尝试将其与一个源表联接。但是,这会导致执行时间延长一倍 查看一下执行计划,它会对表执行两次扫描,并将它们合并在一起。有什么提示可以用来说服查询优化器只访问表一次吗 抽象fiddle:,因为优化器永远不会消除查询中指定的表访问,除非该表中实际没有引用任何内容 访问表的次数不能少于查询中引用的次数(据我13年的经验所知)。可能还有其他一些情况,但我所知道的唯一一种情况是,查询优化器可以进行比对象引用数量更少的访问,即当

我正在写一个报告,需要从我无权修改的视图中提取数据。该视图缺少报表所需的列,因此我尝试将其与一个源表联接。但是,这会导致执行时间延长一倍

查看一下执行计划,它会对表执行两次扫描,并将它们合并在一起。有什么提示可以用来说服查询优化器只访问表一次吗


抽象fiddle:

,因为优化器永远不会消除查询中指定的表访问,除非该表中实际没有引用任何内容


访问表的次数不能少于查询中引用的次数(据我13年的经验所知)。可能还有其他一些情况,但我所知道的唯一一种情况是,查询优化器可以进行比对象引用数量更少的访问,即当外部表中没有任何内容被访问时,查询优化器可以优化左外部或右外部联接,并且从约束中知道,排除工作不会改变行数或返回的行数结果。

只需查看两个扫描运算符的输出列即可。一旦它用于描述列,就可以扫描视图中的列。您是否被迫使用此视图?我要么创建一个新视图(索引,因为这是可能的),要么只使用没有视图的基表。@GordonLinoff:你确定吗?我记得阅读的所有内容都表明,视图和iTVF被扩展到它们周围的查询中,然后作为一个单元进行优化。@GordonLinoff如果它们被单独优化,为什么可以通过在周围的查询中添加where子句来更改执行计划?在这种情况下,添加“WHERE Id=12345”会导致它使用搜索而不是扫描。如果某些索引列未使用,或者外部查询指定了索引中较早的列,则视图甚至可以使用不同的索引来访问表。ORM生成的查询也存在此问题。我认为不可能让优化器折叠冗余访问。我不认为优化器会分解一个视图,然后在它意识到您正在访问与视图相同的表时完全重写您的查询。