powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / снижение misses in library cache during parse
25 сообщений из 25, страница 1 из 1
снижение misses in library cache during parse
    #32182462
Как правильно писать запросы, чтобы они не разбирались повторно при разных значениях данных?
Попробуйте объяснить на примере типа:
Код: plaintext
1.
CREATE TABLE T ( X INT );
INSERT INTO T VALUES(  35 );

Нужно уметь вставлять разные значения X, чтобы снизить количество разборов операторов.
Вариант
Код: plaintext
1.
2.
3.
4.
5.
DECLARE
  V_X T.X%TYPE;
BEGIN
  V_X := <smth>;
  INSERT INTO T VALUES( V_X );
END;

при вызовах с разными <smth> не работает и генерирует для каждого вызова Misses in library cache during parse: 1
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32182537
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как ты проверяешь результаты?
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183113
Я использую SQL_TRACE и TKPROF, иногда исходный SQL_TRACE.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183445
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько понимаю ты хочешь не парсить запрос при изменении колонки.
Так не получится. Будешь парсить каждый раз.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183499
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо биндить переменные

т.е.

вместо записи select * from table where column=10
писать select * from table where column=переменная

есть еще способ установить в ora.ini какую-то переменную (забыл как называется) в значение FORCE, и оракл сам будет при компиляции заменять 10 на произвольную переменную (что иногда работает неправильно)
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183509
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cursor_sharing

... и создает дополнительную нагрузку на CPU
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183519
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
********************************************************************************

DECLARE
  V_X T.X%TYPE;
BEGIN
  V_X :=  8 ;
  INSERT INTO T VALUES( V_X );
END;

call     count       cpu    elapsed       disk      query    current        rows
 ------- ------  -------- ---------- ---------- ---------- ----------  ----------
 
Parse         1        0 . 51         0 . 52            1            0            1             0 
Execute       1        0 . 03         0 . 03            0            0            0             1 
Fetch         0        0 . 00         0 . 00            0            0            0             0 
 ------- ------  -------- ---------- ---------- ---------- ----------  ----------
 
total         2        0 . 54         0 . 55            1            0            1             1 

Misses in library cache during parse:  1 
Optimizer goal: CHOOSE
Parsing user id:  22   
********************************************************************************

INSERT INTO T 
VALUES
( :b1 )


call     count       cpu    elapsed       disk      query    current        rows
 ------- ------  -------- ---------- ---------- ---------- ----------  ----------
 
Parse         5        0 . 35         0 . 35            0            0            0             0 
Execute       5        0 . 00         0 . 00            1            5            8             5 
Fetch         0        0 . 00         0 . 00            0            0            0             0 
 ------- ------  -------- ---------- ---------- ---------- ----------  ----------
 
total        10        0 . 35         0 . 35            1            5            8             5 

Misses in library cache during parse:  1 
Optimizer goal: CHOOSE
Parsing user id:  22      (recursive depth:  1 )
********************************************************************************

DECLARE
  V_X T.X%TYPE;
BEGIN
  V_X :=  7 ;
  INSERT INTO T VALUES( V_X );
END;

call     count       cpu    elapsed       disk      query    current        rows
 ------- ------  -------- ---------- ---------- ---------- ----------  ----------
 
Parse         1        0 . 00         0 . 01            0            0            0             0 
Execute       1        0 . 04         0 . 04            0            0            0             1 
Fetch         0        0 . 00         0 . 00            0            0            0             0 
 ------- ------  -------- ---------- ---------- ---------- ----------  ----------
 
total         2        0 . 04         0 . 05            0            0            0             1 

Misses in library cache during parse:  1 
Optimizer goal: CHOOSE
Parsing user id:  22   
********************************************************************************
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183524
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я выполнила такой запрос 5 раз.

Как видно из отчета Оракл все использует bind variable для

INSERT INTO T VALUES( V_X );

см. в отчете

INSERT INTO T
VALUES
( :b1 )


Выполене 5 раз. Под Parse 5 имеется в виду soft parse. А не найден в кэше запрос был только 1 раз, при первом запуске.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183758
Вопрос для killed

С одной строны ... и создает дополнительную нагрузку на CPU
Но ведь с другой стороны будет использоваться уже ранее подготовленный план выполнения -- что является несомненной экономией. Или я не прав? Подумав логически я таки у себя включил cursor_sharing = FORCE
Может пересмотреть свое решение?
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183812
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Simon

PL/SQL сам "биндит" переменные.

2 killed и Поплюев Алексей

Боюсь, что в примере с insert в PL/SQL cursor_sharing бесполезен по вышеуказаной причине.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183862
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2AI:
PL/SQL сам не биндит переменные! это факт (до оракле 9 точно)
убедитесь что у вас cursor_sharing=FORCE
и tkprof Вам это покажет

если надо инсертами засунуть в бд кучу информации
то лучше использовать bulk binds
будет гораздо быстрей, чем просто кучей инсертов
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183879
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Simon

А что я тогда показывал слушателям на курсах с 1997 года? Именно то, что замена простого SQL на PL/SQL блоки приводит к появлению bind-переменных. Использовал я именно tkprof и v$sql.

cursor_sharing вообще появился в 8.1.6. До этого его не было.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32183917
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Al

declare
i integer;
j integer;
begin
i:=10;
select col into j from table where pkey=i;
select col into j from table where pkey=10;
end;

в первом варианте происходит использование переменных, во втором бинда нет
если вы мне не верите то включите autotrace и посмотрите в tkprof (только цифру 10 каждый раз при запуске меняйте на что-нибудь другое)
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184018
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Simon

Так изначально речь и шла про первый случай. См.

Код: plaintext
1.
V_X := <smth>;
INSERT INTO T VALUES( V_X );


Реальный запрос в tkprof выглядит

INSERT INTO T
VALUES
( :b1 )

Т.е. Оракл сам биндит переменные.

Во втором случае вашего переменные отсутствуют

select col into j from table where pkey=10;

И естественно ничего биндится не будет если не установить cursor_sharing=false
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184037
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь

cursor_sharing=FORCE
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184054
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Violina
так Al утверждает, что в PL/SQL разницы нет, что там всегда все само биндится, а я ему говорю что есть:)
вот:)
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184077
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Simon

Да биндит не всегда, проверила по tkprof

Код: plaintext
1.
2.
BEGIN
  INSERT INTO T VALUES( 9 );
END;


Код: plaintext
1.
2.
BEGIN
  INSERT INTO T VALUES( 6 );
END;


Код: plaintext
1.
2.
BEGIN
  INSERT INTO T VALUES( 3 );
END;


bind не происходит!

Но в случае исходного вопроса, будет ответ, что приведенное решение уже является лучшим которое может быть в данном контексте, т.к. используется bind переменная и соответсвенно soft parse. Ведь так?
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184087
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Simon

Запрос без участия переменных не биндится. В этом нет смысла, поскольку запрос "одноразовый". Даже оракл это понимает.

Кстати я не утверждал, что всегда. Тем более, что Вы сами подтвердили наличие "биндинга". И я писал тоже о переменных.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184135
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Al:
значит я неправильно понял
-----------------------------------------------------------------------------
короче вывод:
1. бинд переменных нужен для того чтобы уменьшить количество разборов в лайброри кэш
2. для этого в sql используем запросы вида
insert into t values (:x)
где :x переменная которую надо забиндить

в pl/sql
insert into t values (p) где p - переменная (это и есть наверно тот автоматический биндинг, который подразумевал Al)

3. а если делаем совсем по уму, то используем bulk bind, т.е вместо ста инсертов загоняем все в pl/sql таблицу и делаем один инсерт
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184149
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Simon

Про bulk bind очень интересно, можно примерчик если не сложно. Например в данном случае я хочу вставить в таблицу Т значения 4, 9, 8, 5, 2.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184181
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Simon

Сама PL/SQL таблица занимает место в стеке серверного процесса. И он может захватить много памяти. Я таким образом однажды поверг в "сиреневый призрак смерти" солярис (перетащил 10 млн записей в таблицу записей). Кроме того, таблицы PL/SQL динамические структуры и работают не бог весть как быстро. Будьте очень внимательны!

Это просто предостережение, а не борьба с таблицами PL/SQL.
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184249
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Violina: вот пример

Код: plaintext
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.
DROP TABLE sr_test_tbl;
CREATE TABLE sr_test_tbl (id INTEGER PRIMARY KEY);
 --
 
DECLARE
  TYPE PLTable IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
   --
 
  l_PLTable PLTable;
  i integer;
BEGIN
  FOR i IN  1 .. 5000  LOOP
    l_PLTable(i) := i*i;
  END LOOP;
   -- 
 
   -- самое главное
 
  FORALL i IN  1 .. 5000 
    INSERT INTO sr_test_tbl values (l_PLTable(i));
   --
 
  DBMS_Output.put_line('Вставили '||TO_CHAR(SQL%ROWCOUNT)||' строк');  
END;
/


2Al: не согласен с тем что plsql таблицы работают медленно
они работают нормально, только иногда требуют много памяти
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184252
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>С одной строны ... и создает дополнительную нагрузку на CPU
Но ведь с другой стороны будет использоваться уже ранее подготовленный план выполнения -- что является несомненной экономией. Или я не прав? Подумав логически я таки у себя включил cursor_sharing = FORCE
Может пересмотреть свое решение?


Когда оракл постоянно занят разбором сиквела, вы увидите конкуренцию за library cache latches. Любая конкуренция на защелках - это повышенная нагрузка на CPU вследствие самой природы доступа к защелкам. Но что еще хуже, это узкое место с точки зрения масштабируемости системы. Т.е. при увеличении кол-ва запросов/пользователей, ситуация будет ухудшаться явно не в линейной зависимости. Поэтому здесь trade off. Я где-то видел упоминание Стива Адамса со ссылкой на Тома, где последний оценивал издержки FORCE в +30% для версии 8.1.7
В 8.1.6 есть баги, связанные с cursor_sharing
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184284
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, я могу ошибаться, но "Misses in library cache during parse: 1" относится скорее к самому plsql-блоку из-за различных значений <smth>
...
Рейтинг: 0 / 0
снижение misses in library cache during parse
    #32184297
2 killed Убедил, вертаю взад - без force. Спасибо.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / снижение misses in library cache during parse
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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