Ric*_*nka 7 sql-server database-performance
我希望创建非规范化的数据访问,主要用于报告目的(从而避免连接和获得性能).我有两个解决方案,但我正在寻找(a)其他可能的解决方案,以及(b)我应该考虑的权衡.我正在使用SQL Server 2008 R2.
在一个解决方案中,我可以在查询上创建索引视图,该视图执行我关心的连接.我的理解是,这确实在幕后实现,但是很棘手,可能无法保证良好的性能(并且对于视图的性能存在激烈的争论).
在另一个解决方案中,我可以构建机器来创建一个表,用我关心的数据填充它,并在事务中将它交换为现有表.
前者对我来说似乎有风险/神奇; 后者看起来很笨拙,容易出错,并可能影响查询计划之类的事情.有人可以帮忙解释一下吗?
视图在优化管道的早期阶段就内联到查询计划中。它们既不会伤害也不会提高性能。
索引视图也是内联的。您是否编写了引用视图的查询或是否粘贴了视图定义并不重要。在企业版上,优化器会尝试将部分查询与管道中的索引视图进行匹配。这确实不靠谱。对于简单的情况,它工作得很好,但我看到它随机失败。没有任何保证。
有一个解决方案:WITH (NOINDEX)强制优化器不内联视图而是使用其索引。这是100%可靠的。
如果您可以将查询模式放入索引视图中并且能够使用该提示(您可以创建始终包含该提示的包装视图),那么索引视图是一个很好的自动且一致的解决方案。
前者对我来说似乎有风险/神奇
有了这个提示,索引视图中就没有什么令人惊讶的了。如果有帮助:我有索引视图的生产经验。他们工作得很好。
后者看起来很糟糕,容易出错,并且可能会影响查询计划等事情。有人可以帮忙解释一下吗?
那是真实的。每个错误都有可能导致数据损坏。您最好不要忘记写入数据的任何位置,否则您的非规范化数据会变得不一致。
如果没有充分的理由反对使用索引视图,我建议您出于这些原因使用索引视图。
| 归档时间: |
|
| 查看次数: |
1566 次 |
| 最近记录: |