Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / снижение misses in library cache during parse / 25 сообщений из 25, страница 1 из 1
14.06.2003, 00:20:01
    #32182462
снижение misses in library cache during parse
Как правильно писать запросы, чтобы они не разбирались повторно при разных значениях данных?
Попробуйте объяснить на примере типа:
Код: 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
14.06.2003, 14:59:14
    #32182537
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
а как ты проверяешь результаты?
...
Рейтинг: 0 / 0
16.06.2003, 13:09:48
    #32183113
снижение misses in library cache during parse
Я использую SQL_TRACE и TKPROF, иногда исходный SQL_TRACE.
...
Рейтинг: 0 / 0
16.06.2003, 16:44:05
    #32183445
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
Насколько понимаю ты хочешь не парсить запрос при изменении колонки.
Так не получится. Будешь парсить каждый раз.
...
Рейтинг: 0 / 0
16.06.2003, 17:25:08
    #32183499
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
Надо биндить переменные

т.е.

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

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

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

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

INSERT INTO T VALUES( V_X );

см. в отчете

INSERT INTO T
VALUES
( :b1 )


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

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

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

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

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

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

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

cursor_sharing вообще появился в 8.1.6. До этого его не было.
...
Рейтинг: 0 / 0
17.06.2003, 10:58:16
    #32183917
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
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
17.06.2003, 11:48:21
    #32184018
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
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
17.06.2003, 11:53:39
    #32184037
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
Извиняюсь

cursor_sharing=FORCE
...
Рейтинг: 0 / 0
17.06.2003, 12:00:26
    #32184054
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
2Violina
так Al утверждает, что в PL/SQL разницы нет, что там всегда все само биндится, а я ему говорю что есть:)
вот:)
...
Рейтинг: 0 / 0
17.06.2003, 12:15:13
    #32184077
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
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
17.06.2003, 12:21:07
    #32184087
AI
AI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
2 Simon

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

Кстати я не утверждал, что всегда. Тем более, что Вы сами подтвердили наличие "биндинга". И я писал тоже о переменных.
...
Рейтинг: 0 / 0
17.06.2003, 12:41:44
    #32184135
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
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
17.06.2003, 12:48:08
    #32184149
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
to Simon

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

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

Это просто предостережение, а не борьба с таблицами PL/SQL.
...
Рейтинг: 0 / 0
17.06.2003, 13:41:19
    #32184249
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
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
17.06.2003, 13:43:01
    #32184252
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снижение misses in library cache during parse
>С одной строны ... и создает дополнительную нагрузку на CPU
Но ведь с другой стороны будет использоваться уже ранее подготовленный план выполнения -- что является несомненной экономией. Или я не прав? Подумав логически я таки у себя включил cursor_sharing = FORCE
Может пересмотреть свое решение?


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


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