【问题标题】:When refreshing the result of a view?刷新视图的结果时?
【发布时间】:2015-01-20 07:37:37
【问题描述】:

我在表格中具体化视图的结果。 我想知道他们是否是一种知道该视图的结果何时更改以刷新它的方法。 物化视图和结果缓存可以做到这一点,但我不想同时使用这两种技术。 他们是用另一种方式回答这个问题吗?

事实上,我们有一个通用系统,它每 n 分钟具体化和刷新一次视图。刷新的成本可能很高,我想知道我们是否可以知道基础数据是否发生了变化。

我们不使用物化视图,因为完全刷新会截断表,而快速刷新仅适用于具有主键的表。

结果缓存无法完成这项工作,因为我们没有足够的内存。

所以我想知道我们是否有一种技术可以知道视图的底层数据自上次刷新后是否发生了变化

【问题讨论】:

  • 你能把你的观点的sql贴出来吗?你的意思是你根本不想使用物化视图?还是只与结果缓存一起使用?
  • 如果您想推出自己的粗略解决方案(不知道为什么,尽管如果数据库具有内置支持),您可以在视图基于的表上插入触发器后更新您的表
  • 我们可以假设表没有主键吗?
  • 嗨,本。你说的对。表没有主键。

标签: sql oracle view materialized-views


【解决方案1】:

你可以有一个看起来像这样的标志表:

CREATE TABLE FlagTable
  SourceTable varchar(30),
  UpdateDate DATETIME,
  Handled CHAR(1) DEFAULT 'N'

在您的基表上创建一个触发器,在该表的 INSERT、UPDATE 或 DELETE 上,您使用基表的名称将一条记录插入到 FlagTable 中

当你想检查刷新时,只需选择 WHERE Handled = 'N',刷新伪视图,然后设置 Handled = 'Y'

【讨论】:

    【解决方案2】:

    这只是一种启发式方法,但作为视图刷新过程的一部分,您可以从源表中查询并存储最大 ora_rowscn 和行数。然后定期检查这些值,看看其中一些表是否发生了变化。

    select MAX(ora_rowscn), COUNT(*) 
      into last_change_scn, last_change_length 
      from src_table;
    

    如果我没记错的话,你的表中是否有任何插入或更新,MAX(ora_rowscn) 会改变。如果有一些删除,COUNT(*) 会改变。

    在黑暗的一面,查询MAX(ora_rowscn) 将触发全表扫描。当然,这并不能告诉您这些更改是否会影响视图。

    【讨论】:

      【解决方案3】:

      您可以通过将 mat_view 设置为在提交时刷新选项并在可能的情况下使其在提交时刷新快速,从而以更简单的方式完成所有这些操作。这将保证您每次发生更改时,视图将仅刷新新行(与完全刷新相比,视图后面的查询作为一个整体执行)。

      现在这最后一种方法可能会导致很多问题,因为 refresh fast on commit 选项有限制,如果你不能遵守它,你就不能使用它。但是,如果您可以将其设置为提交时刷新完成,这可能会像您建议的那样不时减慢系统速度,也可能会导致您无法隔离更改源。

      如果您想查看最频繁更改发生的位置,我建议您使用自定义表(每天)将查询的每日结果存储在 mat_view 后面。然后几天后,只需执行以下操作:

      select * from daily_table_day_one
      minus
      select * from mat_view
      union all
      select * from mat_view
      minus
      select * from daily_table_day_one
      

      ORA_ROWSCN 的方法并不总是有效。带有触发器的方法在有限的情况下有效,如果不需要在 100 个表上创建这些触发器……那太可笑了。

      当您找到更改的来源 - 例如来自某些表的多个列时,您可能会考虑重写 mat_view 查询,遵循一些 DW 原则并创建查询的星型模式。这将对查询进行分段,并且肯定会加快查询速度。检查负载的来源 - 如果那些昂贵的连接,扫描任何无法避免的东西,如果你也可以实现它们,也许在较小的查询上分解查询可以解决问题,也许你可以设置它们并快速刷新也提交。

      这一切都取决于实施。如果您能在此处给出查询的示例或其中的一部分,通过解释计划我们也可以为您提供具体的解决方案。

      干杯

      【讨论】:

      • 您好 g00dy,感谢您的解释。很清楚。不幸的是,它不符合我的问题。我们有一个非常通用的系统,有时具有快速刷新的 mat view 可以解决我们的问题,有时不能。每个能力用户都可以在我们的系统中请求一个新视图,而我们无法控制它们。这就是为什么我们不能使用物化视图来解决它。
      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多