提高 sql server 2012 中的视图性能

Posted

技术标签:

【中文标题】提高 sql server 2012 中的视图性能【英文标题】:improving views performace in sql server 2012 【发布时间】:2014-06-12 14:47:30 【问题描述】:

我有一个返回超过 150.000.000 行的视图 vwBalance,下面是代码:

SELECT    *
FROM            dbo.balance INNER JOIN
                         dbo.NomBalance   ON dbo.balance.IdNomBil = dbo.NomBalance.Id

但我想转置返回的值,所以我使用这样的 PIVOTE 函数:

SELECT  An, cui,caen, col1, col2, ... col 100
FROM   (SELECT     cui, valoare, cod_campbil,caen,An
        FROM vwBilant  WITH (NOLOCK)
        p PIVOT (MAX(valoare) FOR cod_campbil IN ( col1, col2, ... col100   ) AS pvt

问题是:

    我应该在视图 vwBalance 中使用查询提示吗?此提示可以改进或可以锁定转置操作? 如果我使用 NOLOCK 提示而不是其他查询提示会有问题吗? 有更好的方法来改进多列的转置?

谢谢!

【问题讨论】:

转置 150.000.000 行哇。你有没有看过Column Store Indexes,你有典型的场景,Sql Server 2012 中的这个新功能可以真正派上用场。 您真的需要在查询运行时中透视这些数据吗?您的数据多久更改一次?你真的需要总是新鲜的数据吗?您是否考虑过将这些数据以转换后的形式加载到另一个表中? 【参考方案1】:

我可以给出以下建议:

    如果没有破坏您的业务逻辑,您可以使用提示 readpast 您可以为此视图创建聚集索引。它会具体化您的视图,但会降低此视图中使用的所有表的更改操作性能。 此外,您应该检查在 join 和 where 子句中使用的字段的索引。 您可以使用预处理。因此,您将这些值插入到一些 另一张桌子(例如晚上)。在这种情况下,您可以使用 columnstore index 或者只是为此表进行页面压缩 以及您可以将页面 compression 用于所有表格 在此视图中使用。

【讨论】:

谢谢大家,希望这会有所帮助。

以上是关于提高 sql server 2012 中的视图性能的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 性能查询

索引视图以提高 SQL Server 上多个连接的性能

使用 SQL Server 索引来提高性能

从视图填充或创建表的 SQL Server 过程 - 性能问题

在 SQL Server 中的架构绑定视图上创建索引

提高大型表上的 SQL Server 查询性能