Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 SQL Server是否展开视图';在执行过程中,sql是内联的吗?_Sql Server - Fatal编程技术网

Sql server SQL Server是否展开视图';在执行过程中,sql是内联的吗?

Sql server SQL Server是否展开视图';在执行过程中,sql是内联的吗?,sql-server,Sql Server,假设我有一个(假设的)表,名为Table1,有500列,还有一个视图名为View1,它基本上是 select Column1, Column2,..., Column500, ComputedOrForeignKeyColumn1,... from Table1 inner join ForeignKeyTables ..... 现在,当我执行类似于 Select Column32, Column56 from View1 SQL Server会将其转换为以下3项中的哪一

假设我有一个(假设的)表,名为
Table1
,有500列,还有一个视图名为
View1
,它基本上是

 select Column1, Column2,..., Column500, ComputedOrForeignKeyColumn1,...     
 from Table1 
 inner join ForeignKeyTables .....
现在,当我执行类似于

Select Column32, Column56 
from View1
SQL Server会将其转换为以下3项中的哪一项

问题#1:

问题2:

问题3:


我问这个问题的原因是,我确实有一个非常宽的表和一个位于其上的视图(基本上是内部连接以从所有外键ID中获取文本),我无法确定SQL Server是获取所有列,然后选择需要的列,还是只获取需要的列(同时忽略不必要的连接等)…如果是前者,则视图不是最佳性能。

以上所有内容都不是。SQL Server将解析查询,并创建和执行计划。生成的执行计划是基于许多因素计算的,如索引、连接等

你的问题不可能被任何人真正回答,除了你,检查这样的执行计划


有关详细信息,请参阅。

SQL Server查询编译可分为以下几个阶段:

  • 解析
  • 装订
  • 优化
  • 视图解析在绑定期间执行。在此阶段,视图参照将替换为其定义。此时,将出现未使用的视图列

    下一个阶段是优化,将绑定的语法树转换为执行计划。优化器考虑对执行计划进行多种操作以提高效率,删除未使用的列是最基本的操作之一。此时,将删除未使用的列引用

    因此,为了回答您的问题,视图定义中未使用的列不会影响性能,因为优化器将足够聪明地删除它们


    注意:此答案假设视图未编制索引。对于索引视图,解析过程的工作方式不同,更新基表时会有视图维护开销。

    在编译的早期阶段,视图定义与外部查询合并。对于视图上的查询和涉及基表的等效查询,您可能会或可能不会获得相同的执行计划,这取决于视图的复杂性和QO的限制


    对于您的特定情况,值得注意的是,内部联接不仅从联接表中获取数据,而且还限制了结果(与IF-EXISTS检查的方式相同)。如果表之间存在声明性FK,QO将足够聪明,不会检查引用的表,因为约束可以保证存在,否则必须检查。

    谢谢。我现在分析了查询计划,当通过视图运行查询时(当实际查询或多或少相同时),似乎有更多的键查找。查询直接在表上运行,只有索引扫描和哈希匹配。我想这需要更多的研究,我假设它们是等价的。@阿喀琉斯你之所以在执行计划中看到差异,是因为你删除了#2和#3中的内部连接,使得查询不等价。如果使用外部联接,则即使将视图用作源,也可以从执行计划中删除整个分支/表。至少在没有从外部联接表中获得任何列的情况下。但是对于内部连接,必须检查匹配的行。最有可能的是非常接近#1的东西-视图只是一个存储语句-视图的设计通常不是为了提高性能-这不是它们的主要目标-而是为不同的用户/进程组提供定制的数据“视图”。您应该知道“查询#1”不会获取所有列。查询作为一个整体进行优化。如果子查询包含外部查询随后忽略的列,则优化器应该能够生成并使用无法返回该列的计划。在SQL中,您告诉系统您想要什么,而不是如何做。
    select Column32, Column56 
    from 
        (select 
             Column1, Column2,..., Column500, ComputedOrForeignKeyColumn1,... 
         from 
             Table1 
         inner join 
             ForeignKeyTables ......) v
    
    Select Column32, Column56 
    from Table1
    
    select Column32, Column56 
    from 
          (select Column32, Column56 
           from Table1) v