在Oracle数据库中有一个叫做伪列的伪列ora_rowscn.如果它被检索,它会显示该行的最新更改的SCN(正如文档中所述).
也有一个选项rowdependencies的CREATE TABLE该接通SCN的存储对于每一行,而不是一个整体数据块(这是默认值).
所以,我正在使用此列的值来指示哪些行已更新并需要上载到另一个数据库.
让我们考虑这个例子:
T1架构中有一个表,S1其中包含数百万条记录(对于常规查询,表格上的完整扫描无法承受).
CREATE TABLE T1 {
A INTEGER PRIMARY KEY,
B VARCHAR2(100),
C DATE
}
/
Run Code Online (Sandbox Code Playgroud)有模式S2, S3, S4, S5..,每个都有表格T2.
CREATE TABLE T2 {
A INTEGER
}
/
Run Code Online (Sandbox Code Playgroud)只有一行T2,但T2.A在不同的模式中,值可能不同.
所以,我需要在每个模式中检索(S2, S3, S4...)所有S1.T1值都ora_rowscn大于的行S*.T2.A(然后我使用这个数据块).在获取这些行之后,我S*.T2.A用当前系统SCN(dbms_flashback.get_system_change_number)重写了值.
以下是任何架构的查询都在这里:
查询1:
SELECT * FROM S1.T1 WHERE ora_rowscn > (SELECT A FROM T2);
Run Code Online (Sandbox Code Playgroud)
查询2(当我完成上一个查询返回的数据集的工作时执行):
UPDATE T2 SET A = dbms_flashback.get_system_change_number;
Run Code Online (Sandbox Code Playgroud)
问题是查询1的性能是不可接受的(对表进行全面扫描S1.T1)并且ora_rowscn无法对列进行索引.
问题:提高查询性能的方法有哪些?
你不能索引ora_rowscn.因此,查询1的最佳计划是a FULL TABLE SCAN.
由于这是不可接受的,因此您必须使用其他标记,例如last_updated date列.此列是可索引的,但您必须更新它.您可以使用轻量级触发器自动执行此更新.
针对索引列的查询1的性能将取决于检索的行数.