powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Замеры скорости запроса SQL
25 сообщений из 33, страница 1 из 2
Замеры скорости запроса SQL
    #40070184
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос на поверхности простой, но хочется услышать от экспертов разбирающихся в оптимизаторе оракла, или знакомыми с бенчмаркингом динамических запросов в Оракле.

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

Для целей моей задачи запрос считается непрозрачным и цельным, как чужая вьюха: вызывается, бурлит секунд 30 и выдает пару килобайтов информации которая забирается одним глотком. Не имеет побочных эффектов (не пишет в таблицы). Полное раздолье для внутреннего оптимизатора Оракла.

Критерии удачной измерялки:
- запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся.
- резалтсет должен быть получен и съеден. select count(*) from V не годится, оптимизатор Оракла не простак и пропустит большинство вычисляемых столбцов (а то и джойнов) которые не влияют на число строчек.
- измерялка не должна перечислять названия столбцов (полей?) резалтсета. Их много, я ленив.
(перечисление столбцов через системные таблицы не является решением, т.к. запрос динамический sql)
- желательно чтоб измерялка только читала и не писАла. Хотя резалтсет невелик и у меня есть права на запись, я на знаю как запись повлияет на точность измерения и с точки зрения чистоты решения измерялка менять состояние базы не должна.
- желательно чтобы кроме интервала времени измерялка дала если не хэш результата, то хотя бы какой нибудь параметр резалтсета, позволяющее следить за нарушением воспроизводимости.

Извращая синтах оракла, идеальное для меня решение выглядит что-то в виде
Код: plsql
1.
select sum(hash(cast(* as raw))) from V


где значение каждого поля учтено (критерий 2), порядок вычисления строк не важен (критерий 1) и т.д. Стоимостью вычисления контрольной суммы на 2КБ данных можно пренебречь.

Я пока нашел три решения, каждое со своими мелкими недочетами.
Один использует CTAS, два других полагаются на алгебру множеств. Измерения всех трех совпадают на моем 11g.

Из этих трех, лучше всего удовлетворяет моим критериям решение в виде
Код: plsql
1.
2.
3.
4.
5.
select count(*) from (
  select * from V
    intersect
  select * from V
    ) 


но у меня нет уверенности что будущая версия оптимизатора Оракла не заметит тавтологию и не схлопнет вычисляемые столбцы.
Решение через CTAS в одну строчку, но нарушает критерий 4 при каждом измерении, гибридный (CTAS/minus) полагается на создание объекта схемы.

Жаль что в 11g нет PTT, они тут были бы кстати:
Код: plsql
1.
2.
3.
create private temporary table ora$ptt_bench -- требует 18+
  on commit drop definition
  parallel as select * from V;
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070186
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlplus: set autotrace ...
Тупой скрипт: for r in (select * from V) loop i := i+1; end loop; (только установить уровень оптимизации PL/SQL в 0-1)
Ну и информация из v$sql
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070200
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров,

спасибо, посмотрю на что влияет оптимизация PL/SQL, может пригодиться для других задач.
Цикл не подходит, по причине первого критерия.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070209
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Цикл не подходит, по причине первого критерия.


- запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся.


И как Вы его в рабочей базе исполняете в один прием. Научите нас пожалуйста, мы тоже так хотим.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070218
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вопрос на поверхности простой


Цель какая?
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070241
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
НеофитSQL
Цикл не подходит, по причине первого критерия.


- запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся.


И как Вы его в рабочей базе исполняете в один прием. Научите нас пожалуйста, мы тоже так хотим.

Я бы ещё добавил, что есть ещё куча нюансов на стороне приложения, которые влияют на производительность. Тот же prefetch, например.

Вопрос автора в текущей формулировке имеет мало смысла, нужно подтянуть знания. Начать хотя бы с https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-processing.html#GUID-8CF633B1-EAC4-47C7-9189-C479ADEF1FFA
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070346
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev


- запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся.


И как Вы его в рабочей базе исполняете в один прием. Научите нас пожалуйста, мы тоже так хотим.

Какое-то приложение винды, говорит Ораклу: "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее:...".

Это отличается от доступа по частям (дай мне только строки 101-200. а теперь 201-300..)
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070355
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PuM256,

Я хочу получить число в секундах, вызвав SQL запрос (считается черным ящиком) способом, сравнимым с боевым.
Могу это сделать написав клиент в винде, но хотел обойтись силами SQL+.
Я придумал и испытал три метода, они дали одинаковые результаты, совпадающие (+/-5%) с измерением на живой базе.
Методы скорее всего годны.

Решение с использованием PTT мне недоступно на 11g, поэтому некуда девать resultset без записи в базу.

Знания о планах, парсинге и т.д. полезны, и пригодятся когда/если возникнет вопрос об оптимизации запроса, но не в этой теме.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070361
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLЯ придумал и испытал три метода

Среди них был самоочевидный - "использовать команду SET TIMING"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070364
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
значение чостовых переменных

Это опять ваша личная терминология или кошка по клавиатуре прошлась?

НеофитSQL
хотел обойтись силами SQL+.

Код: plsql
1.
set timing on



Если речь о тестировании одного запроса с различными значениями переменных, то тот же jmeter в помощь
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070403
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

ачипятка. Хостовых переменных, конечно.

set timing помогает увидеть время запроса. Тема про метод вызова запроса.

про jmeter не знал, очень полезно.
Кто не знает, вот ссылка: https://jmeter.apache.org/usermanual/build-db-test-plan.html

Теперь смогу скриптануть и померять снаружи, без написания кода.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070414
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Какое-то приложение винды, говорит Ораклу: "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее:...".

Это отличается от доступа по частям (дай мне только строки 101-200. а теперь 201-300..)

Ох уж эти сказочники, ох уж эти сказочники. Нет такого.

1. Приложение винды ничего Oracle говорить не может. Оно данные в сеть (или loopback) посылает.
2. Oracle:
2.1. Делает prepare запроса
2.2. Делает execute запроса
2.3. Делает fetch результатов запроса

Никакого "доступа по частям" и никакого "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее" нет и в помине.

AFAIK
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070419
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

ОК, вот пример. Допустим, боевое приложение написано на Pro*C. В настройках Pro*C при компиляции указывается prefetch=1. Приложение компилируется, запускается, выполняет этот свой "запустить запрос и получить полный результат", время выполнения - 5 минут. Меняем на prefetch=1000, ничего не меняем в приложении, просто перекомпилируем, запускаем - время выполнения того же самого запроса уменьшается до 1 минуты.

Понятно, почему нельзя так просто ставить такую задачу, не разобравшись как в Оракле выполняется запрос? :) Это лишь один пример.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070421
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

много рассуждений, но мало кода, а рассуждения не заменяют практику.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> create table t_del as select o.* from DBA_OBJECTS o cross join DBA_USERS;

Table created.

Elapsed: 00:00:03.65
SQL> begin
  2    for r in (select o.* from DBA_OBJECTS o cross join DBA_USERS) loop null; end loop;
  3  end;
  4  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:06.29
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070422
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL, это Вы к чему?

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

НеофитSQLЦикл не подходит, по причине первого критерия.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070426
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PuM256,

Да, пример понятный. Приложение может быть написано плохо, сетевое соединение может быть плохим, и т.д.

Меня интересует замер скорости исполнения определенного запроса дла базиса (baseline).
У меня нет знаний архитектуры приложения, но есть несколько оосновных предположений о его устройстве и есть голова которая позволяет сделать несколько выводов, например:
- если jmeter (например) получает совпадающий результат запроса значительно быстрее чем приложение, то существует узкое бесто вне оракла
- если jmeter получает совпадающий резалтсет значительно медленнее, то я пропустил важные настройки jmeter которые влияют на производительность
- если время примерно одинаковое для jmeter и для приложения, то в худшем случае ошибки настроек совпали :)

Я не использовал jmeter для моих замеров. Я исключил влияние настроек клиента, сделав тест через CTAS.
Мои результаты на 5% быстрее от наблюдаемого времени исполнения запроса в приложении (что хороший признак, значит клиент без грубых ошибок в этой области), и воспроизводятся с точностью около 2%, что тоже радует.
Ради тщательности, я сделал замеры двумя другими методами описанными ранее, результаты совпали.

Теперь если я, или кто-то другой, будет делать изменения в этом важном запросе, у меня есть способ измерения и результаты предыдущих замеров для оценки результативности усилий.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070429
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
НеофитSQL, это Вы к чему?

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

НеофитSQLЦикл не подходит, по причине первого критерия.


Чтение резалтсета в цикле "for" как было предложенно происходит заметно медленнее.
У меня есть догадки почему это происходит, но независимо от моих догадок цикл тормозит процесс и искажает результаты.

Цикл не предлагать :)
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070433
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах..
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070434
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах..


Спасибо за подсказку.

Вы думаете, я хвастаться сюда прихожу? :) За знаниями, которые иногда приходится клещами..

Я не знал про jmeter, и я не знал про AWR/ASH. Новая для меня область.

С jmeter я вроде разобрался, на следующей неделе поковыряю AWR/ASH.
Надеюсь, это как раз подойдет для моих целей.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070437
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLЯ не знал про jmeter, и я не знал про AWR/ASH. Новая для меня область.

Вообще-то ссылка на AWR - первая в выдаче гугля по запросу "Oracle performance baseline".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070439
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Чтение резалтсета в цикле "for" как было предложенно происходит заметно медленнее.
У меня есть догадки почему это происходит, но независимо от моих догадок цикл тормозит процесс и искажает результаты.

Цикл не предлагать :)
Бредовые требования исходят из бредовых же домыслов.

При желании можно отфетчить все пакетно вручную.
Но for loop фетчит порциями по 100 строк с уровнем оптимизации по умолчанию (plsql_optimize_level = 2) и разница будет мизерная.

Код: 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.
SQL> alter session set plsql_optimize_level = 2;

Session altered.

Elapsed: 00:00:00.01
SQL>
SQL> declare
  2    cursor c is
  3      select rownum id, lpad(' ', 10 , ' ') value
  4        from (select * from dual connect by level <= 3e3),
  5             (select * from dual connect by level <= 3e3);
  6    type tbl_tp is table of c%rowtype;
  7    arr tbl_tp;
  8  begin
  9    open c;
 10    fetch c bulk collect into arr;
 11    close c;
 12  end;
 13  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.64
SQL>
SQL> declare
  2    i int := 0;
  3  begin
  4    for r in (select rownum id, lpad(' ', 10 , ' ') value
  5                from (select * from dual connect by level <= 3e3),
  6                     (select * from dual connect by level <= 3e3)) loop
  7      i := i + 1;
  8    end loop;
  9  end;
 10  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:04.37
SQL>
SQL> alter session set plsql_optimize_level = 0;

Session altered.

Elapsed: 00:00:00.00
SQL>
SQL> declare
  2    cursor c is
  3      select rownum id, lpad(' ', 10 , ' ') value
  4        from (select * from dual connect by level <= 3e3),
  5             (select * from dual connect by level <= 3e3);
  6    type tbl_tp is table of c%rowtype;
  7    arr tbl_tp;
  8  begin
  9    open c;
 10    fetch c bulk collect into arr;
 11    close c;
 12  end;
 13  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.75
SQL>
SQL> declare
  2    i int := 0;
  3  begin
  4    for r in (select rownum id, lpad(' ', 10 , ' ') value
  5                from (select * from dual connect by level <= 3e3),
  6                     (select * from dual connect by level <= 3e3)) loop
  7      i := i + 1;
  8    end loop;
  9  end;
 10  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:44.36



Дальнейшие изыскания чтоб понять разницу можно направить в направлении fetches, rows_processed в v$sql.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070441
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
andrey_anonymous
А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах..


Спасибо за подсказку.

Вы думаете, я хвастаться сюда прихожу? :) За знаниями, которые иногда приходится клещами..

Я не знал про jmeter, и я не знал про AWR/ASH. Новая для меня область.

С jmeter я вроде разобрался, на следующей неделе поковыряю AWR/ASH.
Надеюсь, это как раз подойдет для моих целей.
AWR/ASH вообще из другой оперы если твоя цель выполнить запрос "вытащив" все данные и минимизируя расходы на фетч.
Но когда прийдет понимание как таки быть с фетчем и возникнет задача смотреть план выполнения и анализировать куда ушло время, то можешь ознакомиться с dbms_sqltune.report_sql_monitor
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070442
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
ознакомиться с dbms_sqltune.report_sql_monitor

Решили элегантно подставить коллегу под происки Oracle Legals?
2ТС: warning!
в оракеле не каждую кнопку можно трогать руками, не зная, есть ли у конторы подходящая лицензия.
Потому что кнопка не только сработает, но и зарегистрирует факт своего срабатывания, который отправится в Oracle corp при ближайшем обращении в поддержку.
И dbms_sqltune - одна из таких кнопок.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070444
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Кобанчег
ознакомиться с dbms_sqltune.report_sql_monitor

Решили элегантно подставить коллегу под происки Oracle Legals?
2ТС: warning!
в оракеле не каждую кнопку можно трогать руками, не зная, есть ли у конторы подходящая лицензия.
Потому что кнопка не только сработает, но и зарегистрирует факт своего срабатывания, который отправится в Oracle corp при ближайшем обращении в поддержку.
И dbms_sqltune - одна из таких кнопок.
Это все в точности относится и к AWR/ASH.
Если он сделает
select * from v$active_session_history
уже будет упс без лицензии.
...
Рейтинг: 0 / 0
Замеры скорости запроса SQL
    #40070445
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Надеюсь, это как раз подойдет для моих целей.

Ну "для сориентироваться" можно посмотреть презу

Если оракель легальный, но с лицензиями на extra-cost опции плохо, можете посмотреть на
sqldb360
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Замеры скорости запроса SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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