gpt4 book ai didi

oracle - 如何提高基于 SCN 的查询性能?

转载 作者:行者123 更新时间:2023-12-04 14:46:38 25 4
gpt4 key购买 nike

在 Oracle 数据库中有一个 pseudocolumn which's called ora_rowscn 。如果检索到它,它会显示该行最近更改的 SCN(如文档中所述)。

还有一个选项 rowdependencies of CREATE TABLE 可以打开每行的 SCN 存储,而不是整个数据块(这是默认设置)。

因此,我使用此列的值来指示哪些行已更新并需要上传到另一个数据库。

让我们考虑这个例子:

  • 模式 T1 中有一个表 S1,其中包含数百万条记录(对表进行全面扫描对于常规查询来说是负担不起的)。
    CREATE TABLE T1 {
    A INTEGER PRIMARY KEY,
    B VARCHAR2(100),
    C DATE
    }
    /
  • 有模式 S2, S3, S4, S5.. 并且在每个模式中都有表 T2
    CREATE TABLE T2 {
    A INTEGER
    }
    /
  • T2 中只有一行,但 T2.A 的值在不同模式下可能不同。

  • 所以,我需要在每个模式 (S2, S3, S4...) 中检索来自 S1.T1 的所有行,这些行的值 ora_rowscn 大于 S*.T2.A(然后我使用这个数据块)。
    在获取这些行后,我用当前系统 SCN ( S*.T2.A ) 重写了 dbms_flashback.get_system_change_number 的值。

    任何模式的以下查询都在这里:

    查询 1:
    SELECT * FROM S1.T1 WHERE ora_rowscn > (SELECT A FROM T2);

    查询 2(当我完成处理前一个查询返回的数据集时执行):
    UPDATE T2 SET A = dbms_flashback.get_system_change_number;

    问题是查询 1 的性能是 Not Acceptable (对表 S1.T1 进行全扫描)并且列 ora_rowscn 不能被索引。

    问题: 有什么方法可以提高查询 1 的性能?

    最佳答案

    你不能索引 ora_rowscn 。因此,查询 1 的最佳计划是 FULL TABLE SCAN

    由于这是 Not Acceptable ,您将不得不使用另一个标记,例如 last_updated date 列。此列可编入索引,但您必须对其进行更新。您可以使用小型轻量级触发器自动执行此更新。

    针对索引列的查询 1 的性能将取决于检索的行数。

    关于oracle - 如何提高基于 SCN 的查询性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16565331/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com