查询视图时的性能

时间:2010-05-20 16:50:21

标签: sql sql-server performance

我想知道这是不好的做法,还是一般来说这是正确的方法。

让我们说我创建了一个视图,它结合了几个表中的一些属性。

我的问题是,我需要做什么,所以我可以查询这个视图,好像它是一张桌子而不用担心性能?

原始表中的所有属性都被编入索引,我担心的是结果视图将包含数十万条记录,我希望根据用户输入将其缩小一点。

我想避免的是,有多个版本的代码可以生成此视图,并带有一些额外的“where”条件,以方便用户输入过滤。

例如,假设我的视图有此标题VIEW(Name, Type, DateEntered),这可能有100,000多行(可能是数百万)。我希望能够在SQL Server中创建此视图,然后在我的应用程序中编写这样的查询:

SELECT Name, Type, DateEntered FROM MyView WHERE DateEntered BETWEEN @date1 and @date2;

基本上,我正在为一系列需要运行的报告对数据进行非规范化处理,并且我想集中我从中提取数据的位置,也许我不是从正确的角度看这个问题,所以我愿意采取其他方式来解决这个问题。

6 个答案:

答案 0 :(得分:3)

  

我的问题是,我需要做什么,所以我可以查询这个视图,好像它是一张桌子而不用担心性能?

SQL Server非常善于观察。

您的查询将像在查询本身中使用视图的查询一样高效。

这意味着

CREATE VIEW myview AS
SELECT  *
FROM    /* complex joins */

SELECT  *
FROM    mytable
JOIN    myiew
ON      …

SELECT  *
FROM    mytable
JOIN    (
        SELECT  *
        FROM    /* complex joins */
        ) myview
ON      …

将具有相同的表现。

答案 1 :(得分:1)

SQL Server 2005具有indexed views - 这些提供了视图的索引。这应该有助于提高绩效。如果基础表在查询字段上已经有好的索引,那么将使用这些索引 - 只有在不是这种情况时才应添加索引视图。

这些在其他数据库系统中称为materialized views

答案 2 :(得分:1)

视图将使用WHERE子句中的索引来过滤结果。

视图不是存储结果集。它们是存储的查询,因此每次查询视图时,您都将获得从索引中获得的性能。

答案 3 :(得分:0)

为什么表现不好?我,这意味着您可以将视图视为已编译的select语句。它使用基础表上的现有索引,即使您添加额外的where子句也是如此。在我看来,这是一个很好的方法。在任何情况下,它都比分散在你的应用程序中的几乎相同的select语句更好(至少从设计和可维护性的角度来看)。

答案 4 :(得分:0)

如果没有编入索引,那么......

查询视图时,会忽略它。视图将扩展为主查询。 它与直接查询主表一样。

根据我的经验,什么会杀死你的是视图顶部的视图。

答案 5 :(得分:0)

一般来说,它应该不比内联代码更糟糕。

请注意,可以创建隐藏非常复杂的处理(连接,枢轴,堆叠CTE等)的视图,并且您可能永远不希望任何人能够始终SELECT * FROM view在这样的视图上或所有产品或其他。如果您有标准过滤条件,则可以使用内联表值函数(实际上是参数化视图),这将要求所有用户提供预期参数。

例如,在您的情况下,他们总是必须这样做:

SELECT Name, Type, DateEntered
FROM MyITVF(@date1, @date2);

要在多个ITVF之间共享视图逻辑,您可以在视图之上构建许多内联表值函数,但不允许对用户访问基础表或视图。