基于慢视图创建表以提高性能

问题描述 投票:0回答:1

我们有一个缓慢的视图,正在连接多个表。该视图将由 Power BI 调用,BI 上的任何交互都很慢。

因此,我将视图中的所有数据复制到新的临时表中。它要快得多。但是我不确定应该如何动态维护这个新表。也许我只需要一个调度存储过程来截断并插入到该表中?有更好的方法吗?

我遇到了“物化视图”的想法,但我们不能使用它,因为我们的表会不时被删除和更新。 (当引用的基表中发生 UPDATE 或 DELETE 时,物化视图将被禁用。此限制不适用于 INSERT。要重新启用物化视图,请运行 ALTER MATERIALIZED VIEW with REBUILD。 )

performance azure-sql-database sql-view
1个回答
0
投票

创建一个包含数据的表来替换缓慢的视图是一种老派但完全可以接受的方法。

为了方便沟通,我们将您创建的表称为“报告表”

一个很大的优点是它保持简单,不需要使用其他功能等。一个缺点是数据可能有点过时(取决于您更新报告表的频率)。

对于所使用的表,首先考虑它的结构——特别是聚集索引。理想情况下,它应该是人们使用报告时最常用于过滤数据的工具。

结构完成后,创建一个存储过程(如您所建议的),但我建议预先计算数据并仅更改重要的行,而不是截断/重新插入。

例如,存储过程应该执行以下操作

  • 创建一个与报告表结构相同的临时表(例如,CREATE TABLE #temp)
  • 还为要从报告表中删除的项目创建第二个临时表(例如,将主键列作为其列),例如 CREATE TABLE #tempdelete
  • 将视图中的数据插入#temp 表中
  • 报告表中任何不在 #temp 中的记录,请添加到 #tempdelete
  • #temp 中与报告表相同的任何记录,请从 #temp 表中删除

此时,报告表尚未更新(因此没有人锁定或获取半更新的数据)。 #temp 表有要添加的行,#tempdelete 有要删除的行。请注意,如果已更新,则它将被删除,然后使用新值重新插入。

现在,在事务中,从 #tempdelete 中删除要删除的行,并从 #temp 添加行。它应该非常快 - 只影响更改、删除或新记录。

© www.soinside.com 2019 - 2024. All rights reserved.