powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос с flashback_transaction_query
12 сообщений из 12, страница 1 из 1
Как оптимизировать запрос с flashback_transaction_query
    #39830243
sam_sql.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Включил Flashback Archive для таблицы advisory_arch_20190624:

Запрос ниже выполняется мгновенно и возвращает пару записей:
Код: plsql
1.
2.
3.
4.
select versions_xid, versions_operation, versions_startscn, versions_starttime, versions_endscn, versions_endtime, rowid,--scn_to_timestamp,
       to_char(a.classification), a.* 
  from advisory_arch_20190624 versions between timestamp to_timestamp ('2019-06-24 14:15:46', 'YYYY-MM-DD HH24:MI:SS')  and maxvalue a
 where a.advisoryid = 100511;



Мне нужно достать юзера, который внес эти изменения. Использую для этих целей:

Код: plsql
1.
select * from flashback_transaction_query q where q.xid =  hextoraw('27001200F1220200');



Но если оба селекста скомпоновать в единый запрос , например вот так - получаю висяк.

Код: sql
1.
2.
3.
4.
5.
select versions_xid, versions_startscn, versions_starttime, versions_endscn, versions_endtime, --scn_to_timestamp,
       to_char(a.classification), a.* 
  from vms.advisory_arch_20190624 versions between timestamp to_timestamp ('2019-06-24 13:28:00', 'YYYY-MM-DD HH24:MI:SS') and maxvalue a
    join flashback_transaction_query q on q.xid = a.versions_xid
 where a.advisoryid = 100511;



Есть PK c индексом для vms.advisory_arch_20190624.advisoryid,
но запрос все равно работает через - TABLE ACCESS FULLE TABLE
Я правильно понимаю, что для флешбек-архивов всегда будет FULL ACCESS ?

Как тогда оптимизировать? Или может есть альтернативные способы достать юзера , изменившего строку - для основной таблицы (advisory_arch_20190624)?

Заранее спасибо!
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830350
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sam_sql.ru,

first_rows или leading+use_nl
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830478
Фотография Vivat!San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для таблиц flashback archive можно строить индексы
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830494
sam_sql.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vivat!Sanдля таблиц flashback archive можно строить индексы

я же написал, что индекс уже есть
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830496
sam_sql.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-sam_sql.ru,

first_rows или leading+use_nl

Чет не помогло. Есть еще варианты ? копаю в разные стороны...
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830497
sam_sql.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот результат плана.
Обратите внимание на строку№ 3
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830501
Фотография Vivat!San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sam_sql.ruVivat!Sanдля таблиц flashback archive можно строить индексы

я же написал, что индекс уже есть

в плане видно же, что то что касается flashback archive как раз индекс использует,
остальная часть к нему не относится.
Ну и то что Вы пытаетесь сделать делается через аудит, встроенный либо какой-то самописный.
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830511
sam_sql.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vivat!Sansam_sql.ruпропущено...


я же написал, что индекс уже есть

в плане видно же, что то что касается flashback archive как раз индекс использует,
остальная часть к нему не относится.
Ну и то что Вы пытаетесь сделать делается через аудит, встроенный либо какой-то самописный.

Да я вижу что индекс используется. Но запрос-то по прежнему висит. Думаю зз-за Fixed tables. Ищу пути решения.

Самописный ? Серъезно ? )) Это и есть путь решения по оптимизации?
Про какой конкретно Аудит идет речь?

FDA для моих целей думаю будет вполне достаточно.
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830527
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Простой фикс:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with a as (
   select/*+ no_merge */
          versions_xid, versions_startscn, versions_starttime, versions_endscn, versions_endtime, --scn_to_timestamp,
          to_char(x.classification), 
          x.* 
     from advisory_arch_20190624 versions between timestamp to_timestamp('2019-06-25 22:14:00', 'YYYY-MM-DD HH24:MI:SS') and maxvalue x
     where x.advisoryid = 100511
)
select/*+ leading(a q) use_nl(q) index(q (xid)) */ *
from a
     join flashback_transaction_query q on q.xid = a.versions_xid;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
SQL> ;
  1  explain plan for
  2  with a as (
  3  select/*+ no_merge */
  4         versions_xid, versions_startscn, versions_starttime, versions_endscn, versions_endtime, --scn_to_timestamp,
  5         to_char(x.classification),
  6         x.*
  7    from advisory_arch_20190624 versions between timestamp to_timestamp('2019-06-25 22:14:00', 'YYYY-MM-DD HH24:MI:SS') and maxvalue x
  8    where x.advisoryid = 100511
  9  )
 10  select/*+ leading(a q) use_nl(q) index(q (xid)) */ *
 11  from a
 12*      join flashback_transaction_query q on q.xid = a.versions_xid
SQL> /

Explained.

SQL> @xplan +outline

P_FORMAT
------------------------
typical +outline

1 row selected.


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------
Plan hash value: 2200855354

---------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                        |     1 |  2596 |     6   (0)| 00:00:01 |
|   1 |  NESTED LOOPS            |                        |     1 |  2596 |     6   (0)| 00:00:01 |
|   2 |   VIEW                   |                        |     1 |    98 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL     | ADVISORY_ARCH_20190624 |     1 |     9 |     6   (0)| 00:00:01 |
|*  4 |   FIXED TABLE FIXED INDEX| X$KTUQQRY (ind:1)      |     1 |  2498 |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$4" "X"@"SEL$4")
      USE_NL(@"SEL$62A6D27E" "X$KTUQQRY"@"SEL$3")
      LEADING(@"SEL$62A6D27E" "A"@"SEL$1" "X$KTUQQRY"@"SEL$3")
      FULL(@"SEL$62A6D27E" "X$KTUQQRY"@"SEL$3")
      NO_ACCESS(@"SEL$62A6D27E" "A"@"SEL$1")
      OUTLINE(@"SEL$3")
      OUTLINE(@"SEL$2")
      MERGE(@"SEL$3" >"SEL$2")
      OUTLINE(@"SEL$335DD26A")
      OUTLINE(@"SEL$1")
      MERGE(@"SEL$335DD26A" >"SEL$1")
      OUTLINE(@"SEL$5C160134")
      OUTLINE(@"SEL$5")
      MERGE(@"SEL$5C160134" >"SEL$5")
      OUTLINE_LEAF(@"SEL$62A6D27E")
      OUTLINE_LEAF(@"SEL$4")
      ALL_ROWS
      DB_VERSION('18.1.0')
      OPTIMIZER_FEATURES_ENABLE('18.1.0')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("X"."ADVISORYID"=100511)
   4 - filter("XID"="A"."VERSIONS_XID" AND ("CON_ID"=0 OR "CON_ID"=3))


Дело в том, что FIXED TABLE/FIXED INDEX это встроенные сишные функции и оптимизатор работает с ними немного по-другому и доступ к ним нужно максимально упрощать и избегать любых функций в предикатах, по которым хочешь использование "FIXED TABLE FIXED INDEX", т.к. это входные параметры к функции FIXED TABLE. А в твоем случае VERSIONS_XID - это как раз функция (псевдостолбец/pseudocolumn)
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830529
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума

Решил собрать в одном месте свои сообщения по похожим темам:
Accelerating V$SESSION_EVENT
Возможно ли создать индекс на fixed table (x$)? Проблема с latch free (library cache)
SQL and comparison strings don't ignore case
Описание fixed table

Ну и простенькие скрипты для просмотра описания и индексов на fixed tables:
https://github.com/xtender/xt_scripts/blob/master/fixed_tables.sql
https://github.com/xtender/xt_scripts/blob/master/fixed_indexes.sql

Пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SQL> @fixed_tables.sql X$KTUQQRY

 TABLE_NUM  OBJECT_ID TABLE_NAME                       POSITION COLUMN_NAME                      KQFCODTY TYPE_NAME                        KQFCOTYP COLUMN_SIZE
---------- ---------- ------------------------------ ---------- ------------------------------ ---------- ------------------------------ ---------- -----------
       574 4294952094 X$KTUQQRY                               1 ADDR                                   23 UNSIGNED BINARY INTEGER(8)              9           8
       574 4294952094 X$KTUQQRY                               2 INDX                                    2 NUMBER                                 11           4
       574 4294952094 X$KTUQQRY                               3 INST_ID                                 2 NUMBER                                 11           4
       574 4294952094 X$KTUQQRY                               4 CON_ID                                  2 NUMBER                                 11           2
       574 4294952094 X$KTUQQRY                               5 XID                                    23 UNSIGNED BINARY INTEGER(8)             27           8
       574 4294952094 X$KTUQQRY                               6 START_SCN                               2 NUMBER                                 21           8
       574 4294952094 X$KTUQQRY                               7 START_TIMESTAMP                        12 DATE                                   10           7
       574 4294952094 X$KTUQQRY                               8 COMMIT_SCN                              2 NUMBER                                 21           8
       574 4294952094 X$KTUQQRY                               9 COMMIT_TIMESTAMP                       12 DATE                                   10           7
       574 4294952094 X$KTUQQRY                              10 LOGON_USER                              1 VARCHAR                                 5         128
       574 4294952094 X$KTUQQRY                              11 UNDO_CHANGE#                            2 NUMBER                                 11           4
       574 4294952094 X$KTUQQRY                              12 OPERATION                               1 VARCHAR                                 5          32
       574 4294952094 X$KTUQQRY                              13 TABLE_OWNER                             1 VARCHAR                                 5         386
       574 4294952094 X$KTUQQRY                              14 TABLE_NAME                              1 VARCHAR                                 5         256
       574 4294952094 X$KTUQQRY                              15 ROW_ID                                  1 VARCHAR                                 5          19
       574 4294952094 X$KTUQQRY                              16 UNDO_SQL                                1 VARCHAR                                 3        4000


SQL> @fixed_indexes.sql X$KTUQQRY

TABLE_NAME                     INDEX_NUMBER COLUMN_POSITION COLUMN_NAME
------------------------------ ------------ --------------- ------------------------------
X$KTUQQRY                                 1               0 XID


...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830545
sam_sql.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderПростой фикс:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with a as (
   select/*+ no_merge */
          versions_xid, versions_startscn, versions_starttime, versions_endscn, versions_endtime, --scn_to_timestamp,
          to_char(x.classification), 
          x.* 
     from advisory_arch_20190624 versions between timestamp to_timestamp('2019-06-25 22:14:00', 'YYYY-MM-DD HH24:MI:SS') and maxvalue x
     where x.advisoryid = 100511
)
select/*+ leading(a q) use_nl(q) index(q (xid)) */ *
from a
     join flashback_transaction_query q on q.xid = a.versions_xid;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
SQL> ;
  1  explain plan for
  2  with a as (
  3  select/*+ no_merge */
  4         versions_xid, versions_startscn, versions_starttime, versions_endscn, versions_endtime, --scn_to_timestamp,
  5         to_char(x.classification),
  6         x.*
  7    from advisory_arch_20190624 versions between timestamp to_timestamp('2019-06-25 22:14:00', 'YYYY-MM-DD HH24:MI:SS') and maxvalue x
  8    where x.advisoryid = 100511
  9  )
 10  select/*+ leading(a q) use_nl(q) index(q (xid)) */ *
 11  from a
 12*      join flashback_transaction_query q on q.xid = a.versions_xid
SQL> /

Explained.

SQL> @xplan +outline

P_FORMAT
------------------------
typical +outline

1 row selected.


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------
Plan hash value: 2200855354

---------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                        |     1 |  2596 |     6   (0)| 00:00:01 |
|   1 |  NESTED LOOPS            |                        |     1 |  2596 |     6   (0)| 00:00:01 |
|   2 |   VIEW                   |                        |     1 |    98 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL     | ADVISORY_ARCH_20190624 |     1 |     9 |     6   (0)| 00:00:01 |
|*  4 |   FIXED TABLE FIXED INDEX| X$KTUQQRY (ind:1)      |     1 |  2498 |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$4" "X"@"SEL$4")
      USE_NL(@"SEL$62A6D27E" "X$KTUQQRY"@"SEL$3")
      LEADING(@"SEL$62A6D27E" "A"@"SEL$1" "X$KTUQQRY"@"SEL$3")
      FULL(@"SEL$62A6D27E" "X$KTUQQRY"@"SEL$3")
      NO_ACCESS(@"SEL$62A6D27E" "A"@"SEL$1")
      OUTLINE(@"SEL$3")
      OUTLINE(@"SEL$2")
      MERGE(@"SEL$3" >"SEL$2")
      OUTLINE(@"SEL$335DD26A")
      OUTLINE(@"SEL$1")
      MERGE(@"SEL$335DD26A" >"SEL$1")
      OUTLINE(@"SEL$5C160134")
      OUTLINE(@"SEL$5")
      MERGE(@"SEL$5C160134" >"SEL$5")
      OUTLINE_LEAF(@"SEL$62A6D27E")
      OUTLINE_LEAF(@"SEL$4")
      ALL_ROWS
      DB_VERSION('18.1.0')
      OPTIMIZER_FEATURES_ENABLE('18.1.0')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("X"."ADVISORYID"=100511)
   4 - filter("XID"="A"."VERSIONS_XID" AND ("CON_ID"=0 OR "CON_ID"=3))


Дело в том, что FIXED TABLE/FIXED INDEX это встроенные сишные функции и оптимизатор работает с ними немного по-другому и доступ к ним нужно максимально упрощать и избегать любых функций в предикатах, по которым хочешь использование "FIXED TABLE FIXED INDEX", т.к. это входные параметры к функции FIXED TABLE. А в твоем случае VERSIONS_XID - это как раз функция (псевдостолбец/pseudocolumn)

Понял, Спасибо!

К сожалению этот запрос с хинтами тоже зависает.

Переписал на подзапрос из этой таблицы через самописную функцию - работает быстро!

Код: plsql
1.
2.
3.
4.
5.
select get_from_fix_table(versions_xid) as user_col, 
       versions_xid, versions_operation, versions_startscn, versions_starttime, versions_endscn, versions_endtime, rowid,
       to_char(a.classification), a.* 
  from vms.advisory_arch_20190625 versions between timestamp to_timestamp ('2019-06-25 12:07:11', 'YYYY-MM-DD HH24:MI:SS')  and maxvalue a
 where a.advisoryid = '100511';
...
Рейтинг: 0 / 0
Как оптимизировать запрос с flashback_transaction_query
    #39830547
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sam_sql.ruСамописный ? Серъезно ? )) Это и есть путь решения по оптимизации?Чудак, собственное решение всегда легко поддаётся прогнозируемому управлению.
Но дон-кихоты предпочитают боротся с мельницами оракла… Ковыряться в говнах его кишок… Это путь DBA.
А здравые разработчики выберут другой путь, просто чтобы не создавать этих проблем в первую очередь себе, а опосредованно - DBA.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос с flashback_transaction_query
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]