我们有一个缓慢的视图,正在连接多个表。该视图将由 Power BI 调用,BI 上的任何交互都很慢。
因此,我将视图中的所有数据复制到新的临时表中。它要快得多。但是我不确定应该如何动态维护这个新表。也许我只需要一个调度存储过程来截断并插入到该表中?有更好的方法吗?
我遇到了“物化视图”的想法,但我们不能使用它,因为我们的表会不时被删除和更新。 (当引用的基表中发生 UPDATE 或 DELETE 时,物化视图将被禁用。此限制不适用于 INSERT。要重新启用物化视图,请运行 ALTER MATERIALIZED VIEW with REBUILD。 )
创建一个包含数据的表来替换缓慢的视图是一种老派但完全可以接受的方法。
为了方便沟通,我们将您创建的表称为“报告表”
一个很大的优点是它保持简单,不需要使用其他功能等。一个缺点是数据可能有点过时(取决于您更新报告表的频率)。
对于所使用的表,首先考虑它的结构——特别是聚集索引。理想情况下,它应该是人们使用报告时最常用于过滤数据的工具。
结构完成后,创建一个存储过程(如您所建议的),但我建议预先计算数据并仅更改重要的行,而不是截断/重新插入。
例如,存储过程应该执行以下操作
此时,报告表尚未更新(因此没有人锁定或获取半更新的数据)。 #temp 表有要添加的行,#tempdelete 有要删除的行。请注意,如果行已更新,则它将被删除,然后使用新值重新插入。
现在,在事务中,从 #tempdelete 中删除要删除的行,并从 #temp 添加行。它应该非常快 - 只影响更改、删除或新记录。