预暂存数据解决方案

时间:2016-04-26 11:12:58

标签: sql sql-server

我的任务是更换一个昂贵的存储过程,该过程在10-15个表中执行计算,其中一些表包含数百万行。计划是预先进行许多计算,并将结果存储在单独的表中,以加快阅读速度。

快速创建这些新表并插入所有必要的预先准备好的数据作为测试用例,获得相同结果的执行时间大大改善,正如您所期望的那样。

我的问题是,保持这些新的单独表格最新的最佳做法是什么

  • 以特定间隔运行的程序可以做到,但在那里 是要求数据生效。
  • 每张桌子上的触发器都可以做到,但这看起来非常昂贵,而且 可能会导致使用这些表的其他地方减速。

还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

您为此考虑了索引视图吗?只要您符合创建索引视图的标准(没有自连接等),它可能是一个很好的解决方案。

索引视图的缺点是当基础表中的数据发生更改(删除,更新,插入)时,它将不得不重新计算索引视图。这可能会在某些情况下减慢这些类型的操作,因此您必须小心。我已经在下面的文档中添加了一些链接;

https://www.brentozar.com/archive/2013/11/what-you-can-and-cant-do-with-indexed-views/

https://msdn.microsoft.com/en-GB/library/ms191432.aspx

https://technet.microsoft.com/en-GB/library/ms187864(v=sql.105).aspx

答案 1 :(得分:1)

保持这些新的单独表格最新的最佳做法是什么?

答案取决于。取决于什么......?

1.您经常使用这些计算值 2.什么是可接受的数据延迟

我们有相同类型的报告,我们将计算值存储在单独的表中并在报告中使用它们。在我们的例子中,我们在通过SQL Server代理发送报告之前运行此sps

答案 2 :(得分:1)

考虑使用A / B表解决方案。在_A表版本上放置一个通用视图(CREATE VIEW MY_TABLE AS SELECT * FROM MY_TABLE_A)。然后重建_B版本,然后将视图切换到_B版本(CREATE VIEW MY_TABLE AS SELECT * FROM MY_TABLE_B)。它需要两倍的处理空间,但它使您有机会在没有停机的情况下构建表。