Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос с flashback_transaction_query / 12 сообщений из 12, страница 1 из 1
25.06.2019, 11:24
    #39830243
sam_sql.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос с flashback_transaction_query
Всем привет.

Включил 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
25.06.2019, 14:01
    #39830350
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос с flashback_transaction_query
sam_sql.ru,

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

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

first_rows или leading+use_nl

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

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

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


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

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

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

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

FDA для моих целей думаю будет вполне достаточно.
...
Рейтинг: 0 / 0
26.06.2019, 01:23
    #39830527
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос с flashback_transaction_query
Простой фикс:
Код: 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
26.06.2019, 01:35
    #39830529
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос с flashback_transaction_query

Решил собрать в одном месте свои сообщения по похожим темам:
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
26.06.2019, 07:42
    #39830545
sam_sql.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос с flashback_transaction_query
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
26.06.2019, 07:54
    #39830547
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос с flashback_transaction_query
sam_sql.ruСамописный ? Серъезно ? )) Это и есть путь решения по оптимизации?Чудак, собственное решение всегда легко поддаётся прогнозируемому управлению.
Но дон-кихоты предпочитают боротся с мельницами оракла… Ковыряться в говнах его кишок… Это путь DBA.
А здравые разработчики выберут другой путь, просто чтобы не создавать этих проблем в первую очередь себе, а опосредованно - DBA.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос с flashback_transaction_query / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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