Sql server SQL Server:引擎是否会从一个视图执行不需要的内容?

Sql server SQL Server:引擎是否会从一个视图执行不需要的内容?,sql-server,performance,views,Sql Server,Performance,Views,如果我有一个生成多个列的视图: CREATE VIEW dbo.foo AS SELECT id, SUM(SELECT [...] ) AS c1, STDEV(SELECT [...] ) AS c2, AVG(SELECT [...] ) AS c3, MIN(SELECT [...] ) AS c4, MAX(SELECT [...] ) AS c5, SUM(SELECT [...] ) AS c6, [...]

如果我有一个生成多个列的视图:

CREATE VIEW dbo.foo AS
SELECT 
    id,
    SUM(SELECT [...] ) AS c1,
    STDEV(SELECT [...] ) AS c2,
    AVG(SELECT [...] ) AS c3,
    MIN(SELECT [...] ) AS c4,
    MAX(SELECT [...] ) AS c5,
    SUM(SELECT [...] ) AS c6,
    [...]
    COUNT(SELECT [...] ) AS cN,
FROM Table
GROUP BY id
但我最终只要求其中一个计算值:

SELECT id, c382
FROM foo
WHERE id = 42
SQL Server是否会计算所有列值而忽略它们

根据我的经验,答案似乎是肯定的。查询:

SELECT id, c382
FROM foo
WHERE id = 42
会比我想象的慢。如果我打破抽象,复制我想要的代码:

SELECT id, c382
FROM (
      SELECT 
       id,
       MAX(SELECT [...] ) AS c382
   FROM Table
   GROUP BY id
) AS MiniView
WHERE id = 42
查询运行得更好

或者可能是在更真实的世界结构中,它开始崩溃:

SELECT bar.*, foo.384
FROM bar
    INNER JOIN foo
    ON bar.Bing = foo.id
WHERE bar.Reticulated = 'splines'

我疯了,还是SQL Server 2000疯了?

我不明白你问题的最后一部分,但第一部分是一个真实的陈述,用视图总结了问题

虽然视图有助于使数据库更易于理解,但很少有视图能因为这样的问题而提高数据库的性能

将视图视为存储select语句的宏是最好的方法。视图引用的位置将被视图的内容完全替换


大多数情况下,在IMO中使用存储过程可以做得更好。

我不理解问题的最后一部分,但第一部分是真实的陈述,并用视图总结了问题

虽然视图有助于使数据库更易于理解,但很少有视图能因为这样的问题而提高数据库的性能

将视图视为存储select语句的宏是最好的方法。视图引用的位置将被视图的内容完全替换

大多数情况下,使用存储过程IMO可以做得更好。

是的,视图将计算所有aggreagte列,只使用指定的一列

不幸的是,这就是观点的方式

但是,您可以避免在视图中创建太多不可用的列?

是的,视图将计算所有aggregte列,只使用您指定的列

不幸的是,这就是观点的方式


但是,您可以避免在一个视图中创建太多不可用的列?

您可以将物化视图创建为一个索引视图并提高性能,但请注意,在调用视图的视图上不能这样做,如果您现在认为性能不好,请等待尝试


现在,让我们来看一个关于在数据库中广泛使用视图的警示故事。我们有一些应用程序开发人员选择使用视图,他们从不直接访问仅表视图。设计时间很好,一切看起来都很棒,而且看起来很容易维护。将网站上线并加载大量的客户数据,而不是他们测试的小数据集,暂停从第一天开始。随着时间的推移,随着客户需求的变化,他们改变了越来越多的事情。每次他们都是通过一个视图。最终视图被称为视图,而视图被称为视图,性能已经下降。最后,他们创建了一个视图,该视图中的视图太多,以至于在查询中可以引用的表的数量达到了极限。请记住,这些表都是相同的,只是在相互调用的视图中都被引用了多次。客户对糟糕的性能感到愤怒,因为似乎没有人能够修复,毕竟这涉及到对应用程序中的每个查询进行从头开始的重新设计,并将业务转移到其他地方。这是该公司拥有的最大客户——对设计人员来说并不太好

您可以将物化视图创建为索引视图并提高性能,但请注意,在调用视图的视图上不能这样做,如果您现在认为性能不好,请等待尝试


现在,让我们来看一个关于在数据库中广泛使用视图的警示故事。我们有一些应用程序开发人员选择使用视图,他们从不直接访问仅表视图。设计时间很好,一切看起来都很棒,而且看起来很容易维护。将网站上线并加载大量的客户数据,而不是他们测试的小数据集,暂停从第一天开始。随着时间的推移,随着客户需求的变化,他们改变了越来越多的事情。每次他们都是通过一个视图。最终视图被称为视图,而视图被称为视图,性能已经下降。最后,他们创建了一个视图,该视图中的视图太多,以至于在查询中可以引用的表的数量达到了极限。请记住,这些表都是相同的,只是在相互调用的视图中都被引用了多次。客户对糟糕的性能感到愤怒,因为似乎没有人能够修复,毕竟这涉及到对应用程序中的每个查询进行从头开始的重新设计,并将业务转移到其他地方。这是该公司拥有的最大客户——对设计人员来说并不太好

这就是它在SQL Server 2000中的典型工作方式。在SQL Server 2005及更高版本中,这一问题也基本上得到了解决。

这就是它在SQL Server中的典型工作方式

2000SQL Server 2005及更高版本也基本上解决了这一问题。

什么是运行更好?你看过执行计划了吗?这一点应该很清楚。在今天的特定示例中,我正在模拟一个带有视图的维度表。@Mehrdad,不需要执行计划就可以知道视图的运行情况会比select语句的运行情况差。您所说的运行情况更好是什么意思?你看过执行计划了吗?这一点应该很清楚。在今天的特定示例中,我正在模拟一个带有视图的维度表。@Mehrdad,不需要执行计划就知道视图的运行情况会比select语句差……或者为这些列的所有可能组合创建一个视图,并将其与所需的列一起使用。grin@astander:该视图用于计算其他信息,这些信息可在报告和分析期间使用。@Hogan:n选择p作为所有值所有1个Cab将不会被使用,或可能的良好性能。。。没有人说要创建1..n列。当你需要的时候,创造你所需要的,然后在需要的时候进行调音。@astander:你有中风或其他什么吗?需要我打电话给医生或其他什么吗?…或者为这些列的所有可能组合创建一个视图,并将其与您需要的列一起使用。grin@astander:该视图用于计算其他信息,这些信息可在报告和分析期间使用。@Hogan:n选择p作为所有值所有1个Cab将不会被使用,或可能的良好性能。。。没有人说要创建1..n列。当你需要的时候,创造你所需要的,然后在需要的时候进行调音。@astander:你有中风或其他什么吗?需要我打电话给医生什么的吗?无法加入存储过程您是否编写了一个只做您想做的事情的新存储过程。或者将proc中的值放入temp表中并连接到该表。从性能的角度来看,在数据库中广泛使用视图通常是个坏主意。就我个人而言,我很少使用视图。我更希望在数据库中看到扩展触发器,而不是扩展视图。我必须再次检查它,但我认为如果将视图的连接替换为派生表的连接:sql server将不会执行不必要的内容。有关视图内容被完全替换的部分是错误的。SQL 2005会将一些谓词推送到视图中,而SQL 2008则做得更好。无法加入存储过程您是否编写了一个只执行您想要执行的操作的新存储过程。或者将proc中的值放入temp表中并连接到该表。从性能的角度来看,在数据库中广泛使用视图通常是个坏主意。就我个人而言,我很少使用视图。我更希望在数据库中看到扩展触发器,而不是扩展视图。我必须再次检查它,但我认为如果将视图的连接替换为派生表的连接:sql server将不会执行不必要的内容。有关视图内容被完全替换的部分是错误的。SQL 2005在视图中执行一些谓词,SQL 2008做得更好。上次我检查时,在物化视图中进行聚合是不可能的。有什么变化吗?上次我检查时,在物化视图中进行聚合是不可能的。有什么变化吗?简单、简洁,我想是真的。我还没有测试它是否在2005年修复,但我相信你是对的+1和接受。简单,简洁,我认为是真的。我还没有测试它是否在2005年修复,但我相信你是对的+1并接受。