| Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
| Все форумы / Oracle | ![]() |
||
|
stil Member Откуда: Кемерово Сообщений: 1082 |
Есть функция ldr.add_to_collection, которая выполняется в цикле от 40 до 60 тыс раз. Запуск цикла циклический - раз в полчаса Промежуток времени 1: SQL ordered by Executions Total Executions: 307,993 Captured SQL account for 61.4% of Total Executions Rows Processed Rows per Exec CPU per Exec (s) Elap per Exec (s) SQL Id SQL Module SQL Text 56,443 56,443 1.00 0.00 0.00 0ha3h1gy3703v ********* (TNS V1-V3) begin :result := ldr.add_to_collection(:f1,:f2,f3); end; .......Промежуток времени 2: строки с этим стэйтментом нет и в помине. Хотя заведомо известно, что запуск был - есть лог, где указывается начало отработки цикла, и его конец. Есть результат отработки этого цикла: слитая на диск коллекция (явно те же 40 до 60 тыс элементов) - это я к тому, что 100%но этот стейтмент выполнялся в этот промежуток времени - и очень много раз. Но тем не менее его в топе по Executions его нет. Почему? Смоделировать ситуацию еще раз не могу, так как не понимаю что происходит. Даже пробовал расширить промежуток 2 - на случай если где то прогнал и цикл в него не попал, но нету.. P.S. select last_active_time from v$sql where sql_text like '%add_to_collection%'тоже показывает, что add_to_collection выполнялась |
| 20 авг 10, 14:37 [9298759] Ответить | Цитировать Сообщить модератору | |
|
stil Member Откуда: Кемерово Сообщений: 1082 |
? |
| 23 авг 10, 07:19 [9306361] Ответить | Цитировать Сообщить модератору | |
|
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 14517 |
Есть определенное количество операторов, которые записываются при SNAPSHOT-е См. DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS
|
||
| 23 авг 10, 07:50 [9306388] Ответить | Цитировать Сообщить модератору | |||
|
stil Member Откуда: Кемерово Сообщений: 1082 |
Вячеслав Любомудров, Видимо я не достаточно точно объяснил... Проблема в том, что этот statement заведомо будет в топ30. А вернее даже он будет на вершине топа - ибо других так часто выполняющихся statement-ов просто нету |
| 23 авг 10, 08:06 [9306423] Ответить | Цитировать Сообщить модератору | |
|
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 14517 |
select * from (select sql_text from v$sql order by executions desc) where rownum <= 30Ну и посмотри, будет он там? И еще, если ты считаешь, что, например в цикле for r in (select ...) loopзапрос выполняется на каждую строку, то ты ошибаешься. Более того, по умолчанию с 10g даже fetch в этом случае не выполняется на каждую строку (в отличии от более ранних версий), выполняется BULK COLLECT по 100 строк сразу |
| 23 авг 10, 08:13 [9306439] Ответить | Цитировать Сообщить модератору | |
|
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 14517 |
Ну и, как вариант, динамическое составление запроса без использования биндов, в результате чего это тысячи разных операторов |
| 23 авг 10, 08:15 [9306446] Ответить | Цитировать Сообщить модератору | |
|
stil Member Откуда: Кемерово Сообщений: 1082 |
Да конечно - там он сверху и есть
Это я в курсе. Но данная вещь дергается хоть и в цикле, но с клиента: это перловый скрипт, который в цикле заполняет через PL/SQL-ное API коллекцию. Которая в конце сливается на диск. Альтернатива построчным инсертам...
Запрос не динамический. Бинды используются (в первоначальном посте я специально это и указал: :f1,:f2,f3) |
||||||
| 23 авг 10, 08:24 [9306466] Ответить | Цитировать Сообщить модератору | |||||||
|
stil Member Откуда: Кемерово Сообщений: 1082 |
То есть вопрос состоит не в том, как уменьшить кол-во запусков этого statement или soft parse связанных с ним, а в том - почему его нет в отчете: хотя точно известно, что он выполнялся и кол-во executions заведомо превышало кол-во executions любого statement, которые в топе таки показываются |
| 23 авг 10, 08:31 [9306480] Ответить | Цитировать Сообщить модератору | |
|
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 14517 |
В DBA_HIST_SQLSTAT за тот промежуток есть этот запрос? |
| 23 авг 10, 08:36 [9306487] Ответить | Цитировать Сообщить модератору | |
|
stil Member Откуда: Кемерово Сообщений: 1082 |
Поискал в принципе этот запрос в DBA_HIST_SQLSTAT. Просмотрел 10 часовой промежуток (примерно +-5 часов от исследуемого времени) - этот запрос есть только в двух снимках из 60 (забыл сказать - промежуток снимков установлен не дефолтовый 1 час, а минимальный возможный - 10 минут). В обоих этих снимках запрос с большим запасом на 1м месте в топе по executions. Цикл, запускающий кучу таких запросов, выполняется (как я уже говорил с интервалом в полчаса) - то есть за 10 часов должно было быть не менее 20 снимков таких. А их всего 2 |
||
| 23 авг 10, 08:54 [9306538] Ответить | Цитировать Сообщить модератору | |||
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
Возможно в момент создания снимка запрос был вытеснен из shared pool. |
| 23 авг 10, 09:35 [9306644] Ответить | Цитировать Сообщить модератору | |
|
stil Member Откуда: Кемерово Сообщений: 1082 |
Как бы не похоже: select first_load_time, last_load_time, last_active_time, invalidations, executions from v$sql where sql_text like '%ldr.add_to_collectionn%' and sql_id='0ha3h1gy3703v' FIRST_LOAD_TIME LAST_LOAD_TIME LAST_ACTIVE_TIME INVALIDATIONS EXECUTIONS 2010-08-05/17:04:46 2010-08-13/11:34:38 23.08.2010 14:05 1 47493832Да и что он каждые полчаса вытесняется? С чего бы? База не сильно нагружена. Пул большой |
||
| 23 авг 10, 11:13 [9307224] Ответить | Цитировать Сообщить модератору | |||
|
stil Member Откуда: Кемерово Сообщений: 1082 |
Собственно для чего это все нужно.. Я и до этого замечал, что AWR например в Parse Calls какие то запросы показывает, другие аналогичные (в основном именно массовые вставки с биндами) нет. Хотя ясно, что Soft Parse должен быть в обоих случаях. Вопрос: нету в отчетах - потому что по каким то причинам мне непонятным не происходит парсинга, или все таки какие то вещи в AWR не попадают (напр при маленьком размере снимка??? в 10 минут). Насколько можно доверять AWR-у вообще?? Executions выбрал для примера - потому что exeсute то явно не может не происходить |
| 23 авг 10, 12:36 [9307984] Ответить | Цитировать Сообщить модератору | |
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
|
||
| 23 авг 10, 13:10 [9308229] Ответить | Цитировать Сообщить модератору | |||
|
stil Member Откуда: Кемерово Сообщений: 1082 |
CREATE OR REPLACE PACKAGE DEVDB.pkg AS
type тип_таблица is table of таблица%rowtype not null;
var_таблица тип_таблица:= тип_таблица(); -- Создание и инициализация коллекции.
PROCEDURE add_to_coll(p_поле_таблицы IN таблица.поле_таблицы%type );
PROCEDURE fill_table;
END pkg;
CREATE OR REPLACE PACKAGE BODY DEVDB.pkg_1C AS
PROCEDURE add_to_coll(p_поле_таблицы IN таблица.поле_таблицы%type )
is
begin
var_таблица.extend;
var_таблица(var_таблица.last).поле_таблицы := p_поле_таблицы;
end;
procedure fill_table
is
begin
forall a in var_таблица.first..var_таблица.last
insert into таблица
values var_таблица(a);
var_таблица.trim(var_таблица.count);
end;
END pkg;
/
Далее где то с клиента (разных клиентов - написанных возможно даже на разных языках и вообще не знающих о batch -вставках)for i in (1..много_много)
begin
DEVDB.PKG.add_to_coll(:p_поле_таблицы);
end;
fill_table; Необходимо это чтоб избежать много_много построчных insert (или merge)..Соответственно в общем случае может быть и не одно поле - а вставляться строка с несколькими полями. Под каждый случай сделано свое "API" Вопрос: почему для некоторых случаев в AWR - в секции parse call есть много_много begin PKG.add_to_coll(:p_поле_таблицы); end; а в некоторых нет - просто ли они есть, но не попали в отчет.. Или по каким то причинам в некоторых случаях их просто нет |
||
| 23 авг 10, 13:59 [9308575] Ответить | Цитировать Сообщить модератору | |||
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
Раз клиенты разные и языки разные, то и код они могут генерировать разный. К примеру, если цикл for i in (1..много_много) будет в анонимном PL/SQL блоке, то, естественно, курсоров begin PKG.add_to_coll(:p_поле_таблицы); end; мы в v$sql и соответственно в AWR не увидим. Я бы предложил потрассировать клиентов и посмотреть на цифры парсинга и курсоры. |
| 23 авг 10, 14:59 [9309196] Ответить | Цитировать Сообщить модератору | |
| Между сообщениями интервал более 1 года. |
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
Подниму тему, т.к. сам не понимаю, по какому принципу AWR формирует top запросов. У меня также, как у автора, есть запросы, которые выполняются относительно часто, несколько миллионов раз в час и являются явными кандидатами в top по Executions (они же являются кандидатами и по Gets, что еще важнее). Я вижу их в top в v$sqlstats, но в dba_hist_sqlstat они не попадают. Один из таких запросов я добавил через DBMS_WORKLOAD_REPOSITORY.ADD_COLORED_SQL и он сразу стал в AWR №1 по Executions и в top по Gets. Я всегда думал, что это баг в документации "The number of Top SQL to flush for each SQL criteria (Elapsed Time, CPU Time, Parse Calls, Shareable Memory, Version Count)" и в этом top не хватает Buffer Gets, Physical Reads, Executions, но чего-то я начинаю сомневаться. |
| 16 янв 12, 09:53 [11908829] Ответить | Цитировать Сообщить модератору | |
|
Timur Akhmadeev Member Откуда: Сообщений: 457 |
Данные для статистики берутся напрямую из x$kewrsqlidtab, x$kglcursor_child_sqlidph:
Можно попробовать тем же запросом дергать данные самостоятельно и сравнивать с данными из v$sql (все таки retention у v$sqlstats больше). |
|
| 16 янв 12, 12:20 [11909841] Ответить | Цитировать Сообщить модератору | ||
|
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 14517 |
STATISTICS_LEVEL не может влиять? |
| 17 янв 12, 02:24 [11915158] Ответить | Цитировать Сообщить модератору | |
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
|
||||||
| 17 янв 12, 08:11 [11915297] Ответить | Цитировать Сообщить модератору | |||||||
|
Timur Akhmadeev Member Откуда: Сообщений: 457 |
Да, странно. У dbms_workload_repository это как-то получается: STAT #140376495894456 id=5 cnt=91 pid=4 pos=1 obj=0 op='FIXED TABLE FULL X$KEWRSQLIDTAB (cr=0 pr=0 pw=0 time=93 us cost=0 size=800 card=100)' |
||||
| 17 янв 12, 15:04 [11918286] Ответить | Цитировать Сообщить модератору | |||||
| Все форумы / Oracle | ![]() |
|