0

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

select * from TEST_TABLE as of timestamp (timestamp 2021.05.05 15:00:15);

我想检查查询在 oracle 引擎中的样子。即这个查询的条件是什么,从哪些表中获取数据等等......

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

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 部分时,结果并不相同。

4

1 回答 1

1

如果您指的是闪回数据存档(又名 FDA)使用哪些表,您首先需要了解 Oracle 如何处理闪回查询。

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

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.

现在,如果我进行查询

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

让我们检查一下计划

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 只是在访问该表。为什么 ?因为数据还在 undo 表空间中,因为 undo 块还没有过期。当您使用 FDA 时,Oracle 在您使用闪回查询时将始终使用这种方法:

  • 如果数据到 Undo Tablespace,数据是从它恢复的。
  • 如果数据在 Undo 表空间中不再可用,那么它将从基础 FDA 表中检索行。

在此处输入图像描述

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

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

如果您确定要恢复的数据as of timestamp不再在撤消表空间中,您可以使用10046事件生成跟踪文件,以真正了解 Oracle 是如何真正获取数据的。

尽管我想知道您在获得该级别的详细信息时在寻找什么。

于 2021-10-27T12:24:24.433 回答