Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Замеры скорости запроса SQL / 25 сообщений из 33, страница 1 из 2
14.05.2021, 03:01
    #40070184
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса 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
14.05.2021, 03:52
    #40070186
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
sqlplus: set autotrace ...
Тупой скрипт: for r in (select * from V) loop i := i+1; end loop; (только установить уровень оптимизации PL/SQL в 0-1)
Ну и информация из v$sql
...
Рейтинг: 0 / 0
14.05.2021, 08:09
    #40070200
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
Вячеслав Любомудров,

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


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


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


Цель какая?
...
Рейтинг: 0 / 0
14.05.2021, 11:28
    #40070241
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
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
14.05.2021, 15:23
    #40070346
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
Leonid Kudryavtsev


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


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

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

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

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

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

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

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

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

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

Код: plsql
1.
set timing on



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

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

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

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

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

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

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

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

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

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

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

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

Понятно, почему нельзя так просто ставить такую задачу, не разобравшись как в Оракле выполняется запрос? :) Это лишь один пример.
...
Рейтинг: 0 / 0
14.05.2021, 18:09
    #40070421
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса 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
14.05.2021, 18:12
    #40070422
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
НеофитSQL, это Вы к чему?

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

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

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

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

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

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

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

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


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

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


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

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

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

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

Вообще-то ссылка на AWR - первая в выдаче гугля по запросу "Oracle performance baseline".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.05.2021, 19:19
    #40070439
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
Неофит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
14.05.2021, 19:23
    #40070441
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
НеофитSQL
andrey_anonymous
А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах..


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

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

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

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

Решили элегантно подставить коллегу под происки Oracle Legals?
2ТС: warning!
в оракеле не каждую кнопку можно трогать руками, не зная, есть ли у конторы подходящая лицензия.
Потому что кнопка не только сработает, но и зарегистрирует факт своего срабатывания, который отправится в Oracle corp при ближайшем обращении в поддержку.
И dbms_sqltune - одна из таких кнопок.
...
Рейтинг: 0 / 0
14.05.2021, 19:32
    #40070444
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
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
14.05.2021, 19:37
    #40070445
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замеры скорости запроса SQL
НеофитSQL
Надеюсь, это как раз подойдет для моих целей.

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

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


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