RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1194638
Accepted
J Mas
J Mas
Asked:2021-10-24 02:46:07 +0000 UTC2021-10-24 02:46:07 +0000 UTC 2021-10-24 02:46:07 +0000 UTC

“In Database Archiving”选项如何影响索引和性能?

  • 772

Oracle 12c 有一个选项可以将旧数据归档在同一个表中,而无需创建新表 -在数据库归档中。它很容易使用,但我对性能和索引有疑问。

索引如何工作,尤其是唯一索引?
是否可以将这样的值添加到应该是唯一的列中?

例如,归档具有唯一1列值的记录。col NUMBER如果添加带有 的记录会发生什么情况,是否col = 1会考虑归档数据?如果是,那么归档对提高性能没有多大帮助,如果不是,那么当从所有数据中进行选择时 ( visibility = all),就会违反字段的唯一性。

它是怎么运行的?

sql
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    0xdb
    2021-10-25T22:58:54Z2021-10-25T22:58:54Z

    关于12.1 文档中新的In Database Archiving选项:

    借助数据库内归档,您可以在单个数据库中将更多数据存储更长时间,而不会影响应用程序性能。

    您可以在表本身中存储更长时间的更多数据,而不会降低查询性能。
    请注意,文档中没有提到性能改进。

    要管理表的数据库内归档,您必须为表启用 ROW ARCHIVAL 并操作表的 ORA_ARCHIVE_STATE 隐藏列。

    为此,将在表中创建一个隐藏字符列(此版本中还引入了隐藏列) ,ORA_ARCHIVE_STATE默认值为'0'=active,可以将其设置'1'=archived为使该条目对查询不可见,而无需在查询条件本身中明确指定它.

    换句话说,对归档记录的过滤本质上是一个正常的谓词,将在执行查询时隐式添加,您不应该期望优化器在读取时“神奇地”绕过归档记录。归档记录不会以任何方式影响索引。


    为了确认上述内容,让我们看一个可重现的示例:

    create table t (x int unique, y int) row archival
    /
    insert /*+ append */ into t
        select rownum, rownum from dual connect by level<=1e5
    /
    100,000 rows inserted.
    commit;
     
    update t set ora_archive_state='1' where x<=99999
    /
    99,999 rows updated.
    commit;
    
    select t.*, ora_archive_state from t 
    /
             X          Y ORA_ARCHIVE_STATE       
    ---------- ---------- ------------------------
        100000     100000 0                       
    
    insert into t values (1, 1)
    /
    Error report -
    ORA-00001: unique constraint (DB.SYS_C0011003) violated
    

    虽然没有收集统计​​信息,但优化器认为查询将返回 100K 记录:

    SQL> set autotrace trace
    SQL> select t.* from t
    
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |   100K|  1171K|    69   (2)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T    |   100K|  1171K|    69   (2)| 00:00:01 |
    --------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("T"."ORA_ARCHIVE_STATE"='0')
    

    收集统计数据后,将包括归档记录:

    SQL> exec dbms_stats.gather_table_stats (user, upper ('t'), cascade=>true)
    SQL> select  num_rows from user_tables where table_name = 'T';
    
    TABLE_NAME         NUM_ROWS
    ---------------- ----------
    T                    100000
    
    SQL> select table_name, index_name, num_rows from user_indexes where table_name = 'T';
    
    TABLE_NAME       INDEX_NAME         NUM_ROWS
    ---------------- ---------------- ----------
    T                SYS_C0011003         100000
    
    SQL> select column_name, num_distinct, low_value, high_value from dba_tab_col_statistics
    where table_name = 'T';
    
    COLUMN_NAME       NUM_DISTINCT LOW_VALUE  HIGH_VALUE
    ----------------- ------------ ---------- ----------
    ORA_ARCHIVE_STATE            2 30         31        
    

    现在优化器知道查询将只返回一条记录,但这并没有使选择更有效 - 仍然是全表扫描:

    SQL> select t.* from t
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |    12 |    69   (2)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T    |     1 |    12 |    69   (2)| 00:00:01 |
    --------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - filter("T"."ORA_ARCHIVE_STATE"='0')
    
    • 3

相关问题

  • 通过 OUT 参数从过程结果输出

  • ON 关键字附近的语法错误 - SQL

  • 多表查询中的 Count() 聚合函数

  • 根据时间更改单元格中的日期

  • phpMyAdmin 中的错误 #1064 SQL 查询

  • Qt:包含变量的数据库查询

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5