首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FDA的询问背后发生了什么?

FDA的询问背后发生了什么?
EN

Stack Overflow用户
提问于 2021-10-27 11:46:28
回答 1查看 41关注 0票数 0

假设我想提取某个日期的TEST_TABLE表的数据。我用FDA语法创建了一个查询:

代码语言:javascript
复制
select * from TEST_TABLE as of timestamp (timestamp 2021.05.05 15:00:15);

我想检查一下查询在oracle引擎中到底是什么样子。例如,这个查询的条件是什么,数据是从什么表中提取的,等等。

执行计划返回给我以下信息:

代码语言:javascript
复制
Predicate Information (identified by operation id):
------------------------------------------
* 4 - filter(("STARTSCN"<=148411288669 OR "STARTSCN" IS NULL) AND "ENDSCN">148411288669 AND ("OPERATION"<>'D' OR "OPERATION" IS NULL) AND "ENDSCN"<=155682149589)
* 5 - filter("STARTSCN"<=148411288669 OR "STARTSCN" IS NULL)
* 7 - filter(("T"."VERSIONS_STARTSCN" IS NULL OR "T"."VERSIONS_STARTSCN"<=148411288669) AND ("T"."VERSIONS_ENDSCN" IS NULL OR "T"."VERSIONS_ENDSCN">148411288669) AND ("T"."VERSIONS_OPERATION" IS NULL
  OR "T"."VERSIONS_OPERATION"<>'D'))
* 8 - filter(("ENDSCN"(+) IS NULL OR "ENDSCN"(+)>155682149589) AND ("STARTSCN"(+)<155682149589 OR "STARTSCN"(+) IS NULL))
* 9 - access("RID"(+)=ROWIDTOCHAR("T".ROWID))

但这并不是我想要的.当我将这些代码添加到TEST_TABLE中的where部分时,得到的结果并不相同。

EN

回答 1

Stack Overflow用户

发布于 2021-10-27 12:24:24

如果您指的是闪回数据归档(也称为FDA )使用哪些表,您首先需要了解Oracle如何使用闪回查询。

让我给你看一个例子。我将创建一个小的闪回档案组,并为其分配一个表。

代码语言:javascript
复制
SQL> create flashback archive fda_test tablespace tbrepdata quota 1g retention 1 year ;

Flashback archive created.

SQL> grant flashback archive on fda_test to test ;

Grant succeeded.

SQL> grant flashback archive administer to test ;

Grant succeeded.

SQL> GRANT EXECUTE ON DBMS_FLASHBACK_ARCHIVE TO test;

Grant succeeded.

SQL> create table test.t1 ( c1 number, c2 number ) flashback archive fda_test ;

Table created.

SQL> insert into test.t1 values ( 1 , 1 ) ;

1 row created.

SQL> insert into test.t1 values ( 2 , 2 ) ;

1 row created.

SQL> insert into test.t1 values ( 3, 3 ) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> update test.t1 set c1=4,c2=4 where c1=3 ;

1 row updated.

SQL> commit ;

Commit complete.

现在,如果我做一个查询

代码语言:javascript
复制
SQL> col versions_startscn format 9999999999999999
SQL> col versions_endscn format 9999999999999999
SQL> r
  1  SELECT versions_startscn,
  2         --versions_starttime,
  3         versions_endscn,
  4         --versions_endtime,
  5         versions_xid,
  6         versions_operation,
  7        c1,
  8        c2
  9*       from test.t1 versions between scn minvalue and maxvalue

VERSIONS_STARTSCN   VERSIONS_ENDSCN VERSIONS_XID     V         C1         C2
----------------- ----------------- ---------------- - ---------- ----------
   13142361651647                   13001C0000AB0000 U          4          4
   13142361651581    13142361651647 20002A00BD960000 I          3          3
   13142361651581                   20002A00BD960000 I          2          2
   13142361651581                   20002A00BD960000 I          1          1

让我们检查一下计划

代码语言:javascript
复制
SQL> set autotrace traceonly
SQL> r
  1  SELECT versions_startscn,
  2         --versions_starttime,
  3         versions_endscn,
  4         --versions_endtime,
  5         versions_xid,
  6         versions_operation,
  7        c1,
  8        c2
  9*       from test.t1 versions between scn minvalue and maxvalue


Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   164 |  4264 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |   164 |  4264 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          5  recursive calls
          4  db block gets
         22  consistent gets
          0  physical reads
          0  redo size
       1091  bytes sent via SQL*Net to client
        591  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

如您所见,Oracle只是在访问表。为什么?因为数据仍然在还原表空间中,因为还原块还没有过期。使用FDA时,Oracle将在您使用闪回查询时始终使用此方法:

  • 如果数据到还原表空间,则从其中恢复数据。
  • 如果数据在还原表空间中不再可用,则它将从基础FDA表中检索行。

基础表包含基于为归档组建立的保留的归档数据

代码语言:javascript
复制
SQL> set lines 200
SQL> SELECT owner_name,
  2         table_name,
  3         flashback_archive_name,
  4         archive_table_name,
  5         status
  6* FROM   dba_flashback_archive_tables where owner_name = 'TEST' and table_name = 'T1'

OWNER_NAME                     TABLE_NAME                     FLASHBACK_ARCHIVE_NAME         ARCHIVE_TABLE_NAME             STATUS
------------------------------ ------------------------------ ------------------------------ ------------------------------ -------------
TEST                           T1                             FDA_TEST                       SYS_FBA_HIST_2779773           ENABLED

如果您确定使用Oracle恢复的数据不再位于还原表空间中,则可以使用10046事件生成一个跟踪文件,以真正了解as of timestamp是如何真正获取数据的。

虽然我想知道你在寻找什么来获得这种级别的细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69738082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档