DBMS_CHANGE_NOTIFICATION的ALL_ROWS标志的阈值是多少?

时间:2015-07-15 14:24:22

标签: database oracle plsql

我正在尝试为Oracle DB中的表创建缓存。我使用DBMS_CHANGE_NOTIFICATION监视数据库中的更改,以自动更新缓存。

然而,只要我做的更新相当小,这只能以令人满意的方式工作 - 如果删除大部分行,则通知结构的ALL_ROWS标志设置为 true 并且ROWID的数组是 NULL

通过反复试验,我发现更新行数的阈值大约是100行,实际上太少了。如果一个表包含数百万行,并且我删除了一千个,那么我没有获得有关更新内容的信息,我必须刷新整个表的缓存,这是不可接受的。

我可以以某种方式更改此阈值吗?我在文档中找不到具体的答案:

  

如果ALL_ROWS(0x1)位置1,则表示整个表   被修改(例如,DELETE * FROM t)或行级粒度   通知中不要求或不提供信息   接收者必须保守地假设整个表有   已失效。

这只能给我一些模糊的信息。

2 个答案:

答案 0 :(得分:2)

docs我发现了这个:

  

如果在表操作标志中设置了ALL_ROWS位,则表示   表中的所有行都可能已被修改。在   除了TRUNCATE之类的操作,它会影响到的所有行   表,如果已滚动单个rowid,也可以设置此位   进入一个完整的表格无效。

     

如果在a中的给定表上修改了太多行,则会发生这种情况   单个事务(超过80个)或总共享内存   由于RDBMS上的rowid导致的消耗太大   (超过动态共享池大小的1%)。在这种情况下,   收件人必须保守地假设整个表已经存在   无效,回调/应用程序必须能够处理此问题   条件。

我在几年前推出了自己的解决方案,它给了我控制/灵活性,但也许有人为你做了一个解决方法(提交50个小块?但是如果你的应用不是唯一一个改变表怎么办? ?)。我认为重点是只缓存缓慢变化的表格,但这种限制对我来说似乎很愚蠢。

答案 1 :(得分:1)

目前有一个程序可以指定值:

SET_ROWID_THRESHOLD

如果我能用吸气剂查看当前值是多么好,我还没有找到它。