在 Oracle 数据库中有一个伪列,称为ora_rowscn
. 如果检索到它,它会显示该行最近更改的 SCN(如文档中所述)。
还有一个选项可以rowdependencies
为CREATE TABLE
每一行而不是整个数据块(这是默认设置)打开 SCN 的存储。
因此,我使用此列的值来指示哪些行已更新并且需要上传到另一个数据库。
让我们考虑这个例子:
T1
架构中有一个表,S1
其中包含数百万条记录(常规查询无法承受对表的全面扫描)。CREATE TABLE T1 { A INTEGER PRIMARY KEY, B VARCHAR2(100), C DATE } /
有模式
S2, S3, S4, S5..
,每个模式都有 tableT2
。CREATE TABLE T2 { A INTEGER } /
中只有一行
T2
,但T2.A
不同模式中的值可能不同。
所以,我需要在每个模式中检索(S2, S3, S4...)
所有S1.T1
值ora_rowscn
大于的行S*.T2.A
(然后我使用这个数据块)。在获取这些行之后,我S*.T2.A
用当前系统 SCN ( dbms_flashback.get_system_change_number
) 重写了 的值。
任何模式的以下查询都在这里:
查询一:
SELECT * FROM S1.T1 WHERE ora_rowscn > (SELECT A FROM T2);
查询 2(它在我完成上一个查询返回的数据集的工作时执行):
UPDATE T2 SET A = dbms_flashback.get_system_change_number;
问题是查询 1 的性能不可接受(对表进行全扫描)并且无法S1.T1
为该列建立索引。ora_rowscn
问题:有什么方法可以提高查询 1 的性能?