powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не выбирается direct path read при insert ... select ...
16 сообщений из 16, страница 1 из 1
Не выбирается direct path read при insert ... select ...
    #39293310
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
При полном сканировании больших таблиц, когда выполняется непосредственно select ..., или при выполнении create table ... as select ... производится чтение, минуя буферный кеш, с событиями direct path read, а при выполнении insert ... select ... - чтение через буферный кеш с событиями db file scattered read. Не могу понять в чём причина, и как заставить insert ... select ... работать через direct path read.

Версия Oracle - 11.2.0.4.0.

Пример запросов:
Код: plsql
1.
2.
3.
4.
5.
6.
create table xxvip_gl_je_lines_copy
as select * from gl_je_lines where rownum <= 20000000;  --direct path read
alter system flush buffer_cache;
insert 
  into xxvip_gl_je_lines_copy
select * from gl_je_lines where rownum <= 20000000;  -- db file scattered read



Выписка из разбора трассировки:
Код: 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.
74.
75.
76.
77.
78.
79.
create table xxvip_gl_je_


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.03       0.03          0          0          0           0
Execute      1     98.52     251.77     371990     431933    2210392    20000000
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     98.56     251.80     371990     431933    2210392    20000000

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 44  
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         0          0          0  LOAD AS SELECT  (cr=431947 pr=371990 pw=491461 time=251760085 us)
  20000000   20000000   20000000   COUNT STOPKEY (cr=372121 pr=371990 pw=0 time=43412509 us)
  20000000   20000000   20000000    TABLE ACCESS FULL GL_JE_LINES (cr=372121 pr=371990 pw=0 time=37033756 us cost=102428 size=3340000000 card=20000000)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  Disk file operations I/O                       44        0.00          0.00
  direct path read                             1643        0.74         33.72
  direct path write                            3478        2.76        113.67
  latch: row cache objects                       29        0.00          0.00
  latch: redo allocation                          1        0.00          0.00
  buffer busy waits                               1        0.00          0.00
  log file switch (private strand flush incomplete)
                                                  1        0.21          0.21
  log file sync                                   1        0.06          0.06
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1        0.02          0.02
********************************************************************************

...

insert into xxvip_gl_je_lines_copy
select * from gl_je_lines where rownum <= 20000000

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1    537.49    1248.19     371594    3440160   28087631    20000000
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2    537.50    1248.20     371594    3440160   28087631    20000000

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 44  
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         0          0          0  LOAD TABLE CONVENTIONAL  (cr=3440180 pr=371594 pw=0 time=1248197759 us)
  20000000   20000000   20000000   COUNT STOPKEY (cr=373987 pr=371594 pw=0 time=942086927 us)
  20000000   20000000   20000000    TABLE ACCESS FULL GL_JE_LINES (cr=373987 pr=371594 pw=0 time=930713853 us cost=2651991 size=86478925960 card=517837880)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  db file scattered read                      23336        4.32        690.90
  log file switch (private strand flush incomplete)
                                                 71        1.36          4.99
  log buffer space                               40        2.12         14.04
  log file switch completion                    134        1.08          6.43
  db file sequential read                         1        0.00          0.00
  latch: row cache objects                       13        0.00          0.00
  latch: cache buffers chains                     1        0.00          0.00
  latch: redo allocation                          1        0.00          0.00
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1        0.00          0.00
********************************************************************************



На всякий случай значения параметров:
_serial_direct_read = auto
_direct_read_decision_statistics_driven = TRUE
_small_table_threshold = 12207 (Количество блоков в таблице - более 5 млн.)
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293339
хм..хм..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grmsh,

oracle делает так вполне разумно:
create - ddl - данные будут сразу зафиксированы и поэтому в буфере не нужны
insert - dml - что ты будешь делать дальше с ними - oracle точно не знает
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293363
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grmsh как заставить insert ... select ... работать через direct path read.

parallel или append
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293368
параллелъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grmsh,

вставка в ту же таблицу, что участвует в селекте?
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293381
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
параллелъGrmsh,

вставка в ту же таблицу, что участвует в селекте?
Код: plsql
1.
2.
3.
insert 
  into xxvip_gl_je_lines_copy
select * from gl_je_lines where rownum <= 20000000;
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293400
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fogel,
С append пробовал, то же самое.
parallel поможет, но переводить же из-за этого все запросы типа insert ... select ... с возможным полным сканированием на параллелизм.
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293412
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм..хм..Grmsh,

oracle делает так вполне разумно:
create - ddl - данные будут сразу зафиксированы и поэтому в буфере не нужны
insert - dml - что ты будешь делать дальше с ними - oracle точно не знает

Не вижу логики. Подтвержу я эту вставку, или откачу, текущему запросу отобранные данные всё равно уже не нужны. В дальнейшем текущей ли сессии или параллельной эти данные могут понадобиться или не понадобиться независимо от того, доставались ли они для операции create или для операции insert.
Если это всё-таки действительно так, то не могли бы вы сослаться на какой-либо подтверждающий источник? Сколько не искал, мне ничего подобного не попадалось.
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293528
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Grmsh_direct_read_decision_statistics_driven = TRUE
_small_table_threshold = 12207 (Количество блоков в таблице - более 5 млн.)

[/quote]
А статистика то актуальна?
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39293755
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderGrmsh_direct_read_decision_statistics_driven = TRUE
_small_table_threshold = 12207 (Количество блоков в таблице - более 5 млн.)


А статистика то актуальна?[/quot]
Актуальна.
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39294723
А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А.
Гость
alter session set events 'trace[nsmtio]'
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39295649
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А.alter session set events 'trace[nsmtio]'
Попробовал на больших таблицах.
При create table ... as select ... получаю трассу подобного вида:

NSMTIO: qertbFetch:NoDirectRead:[- STT < OBJECT_SIZE < MTT]:Obect's size: 1 (blocks), Threshold: MTT(0 blocks),
_object_statistics: enabled, Sage: enabled,
Direct Read for serial qry: disabled(::recursive_call::::), Ascending SCN table scan: FALSE
flashback_table_scan: FALSE, Row Versions Query: FALSE
SqlId: 77mtwmnd4c4pk, plan_hash_value: 1096442870, Object#: 352919, Parition#: 0

*** 2016-08-22 13:05:52.543
NSMTIO: qertbFetch:DirectRead:[OBJECT_SIZE>VLOT]
NSMTIO: Additional Info: VLOT=3051950
Object# = 53074, Object_Size = 8854616 blocks
SqlId = af98f2r04txbs, plan_hash_value = 1849149188, Partition# = 0


Соответствует примерно ожиданиям.

А при insert ... select ... по тем же данным - что-то непонятное:

ksesethighpri: (ksb.c:4201) Failed to elevate LGWR's priority from -100 to 60
Error Info: Category(-2), Opname(skgdism_create), Loc(sp.c:1684), ErrMsg(Error 0) Dism(16)
*** SESSION ID:(601.1) 2016-07-20 04:45:57.055
*** SERVICE NAME:(SYS$BACKGROUND) 2016-07-20 04:45:57.055


*** 2016-07-20 04:45:57.055
Warning: log write elapsed time 632ms, size 1025KB

*** 2016-07-20 04:46:15.805
Warning: log write elapsed time 2521ms, size 467KB
...


На средних же таблицах трасса по insert ... select ... в нормальном виде получается.
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39295650
A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A.
Гость
GrmshА при insert ... select ... по тем же данным - что-то непонятное:

ksesethighpri: (ksb.c:4201) Failed to elevate LGWR's priority from -100 to 60
Error Info: Category(-2), Opname(skgdism_create), Loc(sp.c:1684), ErrMsg(Error 0) Dism(16)
*** SESSION ID:(601.1) 2016-07-20 04:45:57.055
*** SERVICE NAME:(SYS$BACKGROUND) 2016-07-20 04:45:57.055


*** 2016-07-20 04:45:57.055
Warning: log write elapsed time 632ms, size 1025KB

*** 2016-07-20 04:46:15.805
Warning: log write elapsed time 2521ms, size 467KB
...


На средних же таблицах трасса по insert ... select ... в нормальном виде получается.

Это LGWR трейс. Нужен трейс файл foreground процесса.
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39295748
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A.Это LGWR трейс. Нужен трейс файл foreground процесса.
Да, нужный трейс в таком случае не создаётся, только LGWR.

Нашёл, впрочем, таблицу по-меньше, на которой эта проблема не возникает, но поведение при create table ... as select ... и при insert ... select ... аналогичное.

create table ... as select ...

NSMTIO: qertbFetch:NoDirectRead:[- STT < OBJECT_SIZE < MTT]:Obect's size: 1 (blocks), Threshold: MTT(0 blocks),
_object_statistics: enabled, Sage: enabled,
Direct Read for serial qry: disabled(::recursive_call::::), Ascending SCN table scan: FALSE
flashback_table_scan: FALSE, Row Versions Query: FALSE
SqlId: 77mtwmnd4c4pk, plan_hash_value: 1096442870, Object#: 352919, Parition#: 0
NSMTIO: qertbFetch:[MTT < OBJECT_SIZE < VLOT]: Checking cost to read from caches(local/remote) and checking storage reduction factors (OLTP/EHCC Comp)
NSMTIO: kcbdpc:DirectRead: tsn: 10, objd: 32136, objn: 32136
ckpt: 1, nblks: 168430, ntcache: 0, ntdist:0
NSMTIO: Additional Info: VLOT=3051950
Object# = 32136, Object_Size = 168430 blocks
SqlId = 1dgznnwp91ngn, plan_hash_value = 1993557499, Partition# = 0


А при insert ... select ... только в трейсе это:

NSMTIO: qertbFetch:NoDirectRead:[- STT < OBJECT_SIZE < MTT]:Obect's size: 13 (blocks), Threshold: MTT(0 blocks),
_object_statistics: enabled, Sage: enabled,
Direct Read for serial qry: disabled(::recursive_call:pgapls:::), Ascending SCN table scan: FALSE
flashback_table_scan: FALSE, Row Versions Query: FALSE
SqlId: bazquck2vuvm1, plan_hash_value: 2135017060, Object#: 89004, Parition#: 0
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39298137
A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A.
Гость
Пока не очень ясно откуда
Direct Read for serial qry: disabled(::recursive_call::::)

Либо это от вспомогательных рекурсивных запросов, либо основной INSERT считается рекурсивным.
INSERT вызывается напрямую или вложен куда-то?
Какой-либо из этих object#
352919
32136
89004
53074
является gl_je_lines или gl_je_lines_copy?

SR не создан на эту тему?
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39299014
A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A.
Гость
ОК, вроде разобрался.

Действительно в 11g внутри INSERT serial direct reads отключаются.

Легко воспроизводится в 11g на простом примере
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table dualcopy as select * from dual;
 
exec dbms_stats.gather_table_stats(user, 'dualcopy');
exec dbms_stats.set_table_stats(user, 'dualcopy', numblks=>999999);
 
create table dualcopy2 as select * from dualcopy;

vs

insert into dualcopy2 select * from dualcopy;


Пофиксено в (12.1)
Код: plaintext
BUG 13250070 - ENABLE DIRECT READS FOR SERIAL INSERTS
(internal)

Если сильно нужна эта функциональность, можешь создать SR и запросить бэкпорт.
...
Рейтинг: 0 / 0
Не выбирается direct path read при insert ... select ...
    #39308279
Grmsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое!
Уходил в отпуск, не видел последних сообщений.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не выбирается direct path read при insert ... select ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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