提高 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 中的视图性能的主要内容,如果未能解决你的问题,请参考以下文章