|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Вопрос на поверхности простой, но хочется услышать от экспертов разбирающихся в оптимизаторе оракла, или знакомыми с бенчмаркингом динамических запросов в Оракле. Мне хочется измерить время исполнения запроса. Запрос параметризован переменными хоста, поэтому измерений будет более сотни, их сделает скрипт который предстоит написать. Для целей моей задачи запрос считается непрозрачным и цельным, как чужая вьюха: вызывается, бурлит секунд 30 и выдает пару килобайтов информации которая забирается одним глотком. Не имеет побочных эффектов (не пишет в таблицы). Полное раздолье для внутреннего оптимизатора Оракла. Критерии удачной измерялки: - запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся. - резалтсет должен быть получен и съеден. select count(*) from V не годится, оптимизатор Оракла не простак и пропустит большинство вычисляемых столбцов (а то и джойнов) которые не влияют на число строчек. - измерялка не должна перечислять названия столбцов (полей?) резалтсета. Их много, я ленив. (перечисление столбцов через системные таблицы не является решением, т.к. запрос динамический sql) - желательно чтоб измерялка только читала и не писАла. Хотя резалтсет невелик и у меня есть права на запись, я на знаю как запись повлияет на точность измерения и с точки зрения чистоты решения измерялка менять состояние базы не должна. - желательно чтобы кроме интервала времени измерялка дала если не хэш результата, то хотя бы какой нибудь параметр резалтсета, позволяющее следить за нарушением воспроизводимости. Извращая синтах оракла, идеальное для меня решение выглядит что-то в виде Код: plsql 1.
где значение каждого поля учтено (критерий 2), порядок вычисления строк не важен (критерий 1) и т.д. Стоимостью вычисления контрольной суммы на 2КБ данных можно пренебречь. Я пока нашел три решения, каждое со своими мелкими недочетами. Один использует CTAS, два других полагаются на алгебру множеств. Измерения всех трех совпадают на моем 11g. Из этих трех, лучше всего удовлетворяет моим критериям решение в виде Код: plsql 1. 2. 3. 4. 5.
но у меня нет уверенности что будущая версия оптимизатора Оракла не заметит тавтологию и не схлопнет вычисляемые столбцы. Решение через CTAS в одну строчку, но нарушает критерий 4 при каждом измерении, гибридный (CTAS/minus) полагается на создание объекта схемы. Жаль что в 11g нет PTT, они тут были бы кстати: Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 03:01 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
sqlplus: set autotrace ... Тупой скрипт: for r in (select * from V) loop i := i+1; end loop; (только установить уровень оптимизации PL/SQL в 0-1) Ну и информация из v$sql ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 03:52 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, спасибо, посмотрю на что влияет оптимизация PL/SQL, может пригодиться для других задач. Цикл не подходит, по причине первого критерия. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 08:09 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL Цикл не подходит, по причине первого критерия. - запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся. И как Вы его в рабочей базе исполняете в один прием. Научите нас пожалуйста, мы тоже так хотим. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 09:31 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL Вопрос на поверхности простой Цель какая? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 10:08 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev НеофитSQL Цикл не подходит, по причине первого критерия. - запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся. И как Вы его в рабочей базе исполняете в один прием. Научите нас пожалуйста, мы тоже так хотим. Я бы ещё добавил, что есть ещё куча нюансов на стороне приложения, которые влияют на производительность. Тот же prefetch, например. Вопрос автора в текущей формулировке имеет мало смысла, нужно подтянуть знания. Начать хотя бы с https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-processing.html#GUID-8CF633B1-EAC4-47C7-9189-C479ADEF1FFA ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 11:28 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev - запрос должен исполниться в один прием как это происходит в рабочей базе. Циклы/кусроры не годятся. И как Вы его в рабочей базе исполняете в один прием. Научите нас пожалуйста, мы тоже так хотим. Какое-то приложение винды, говорит Ораклу: "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее:...". Это отличается от доступа по частям (дай мне только строки 101-200. а теперь 201-300..) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 15:23 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
PuM256, Я хочу получить число в секундах, вызвав SQL запрос (считается черным ящиком) способом, сравнимым с боевым. Могу это сделать написав клиент в винде, но хотел обойтись силами SQL+. Я придумал и испытал три метода, они дали одинаковые результаты, совпадающие (+/-5%) с измерением на живой базе. Методы скорее всего годны. Решение с использованием PTT мне недоступно на 11g, поэтому некуда девать resultset без записи в базу. Знания о планах, парсинге и т.д. полезны, и пригодятся когда/если возникнет вопрос об оптимизации запроса, но не в этой теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 15:34 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQLЯ придумал и испытал три метода Среди них был самоочевидный - "использовать команду SET TIMING"? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 15:42 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL значение чостовых переменных Это опять ваша личная терминология или кошка по клавиатуре прошлась? НеофитSQL хотел обойтись силами SQL+. Код: plsql 1.
Если речь о тестировании одного запроса с различными значениями переменных, то тот же jmeter в помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 15:47 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
env, ачипятка. Хостовых переменных, конечно. set timing помогает увидеть время запроса. Тема про метод вызова запроса. про jmeter не знал, очень полезно. Кто не знает, вот ссылка: https://jmeter.apache.org/usermanual/build-db-test-plan.html Теперь смогу скриптануть и померять снаружи, без написания кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 17:18 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL Какое-то приложение винды, говорит Ораклу: "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее:...". Это отличается от доступа по частям (дай мне только строки 101-200. а теперь 201-300..) Ох уж эти сказочники, ох уж эти сказочники. Нет такого. 1. Приложение винды ничего Oracle говорить не может. Оно данные в сеть (или loopback) посылает. 2. Oracle: 2.1. Делает prepare запроса 2.2. Делает execute запроса 2.3. Делает fetch результатов запроса Никакого "доступа по частям" и никакого "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее" нет и в помине. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 17:53 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL, ОК, вот пример. Допустим, боевое приложение написано на Pro*C. В настройках Pro*C при компиляции указывается prefetch=1. Приложение компилируется, запускается, выполняет этот свой "запустить запрос и получить полный результат", время выполнения - 5 минут. Меняем на prefetch=1000, ничего не меняем в приложении, просто перекомпилируем, запускаем - время выполнения того же самого запроса уменьшается до 1 минуты. Понятно, почему нельзя так просто ставить такую задачу, не разобравшись как в Оракле выполняется запрос? :) Это лишь один пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 18:05 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, много рассуждений, но мало кода, а рассуждения не заменяют практику. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 18:09 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL, это Вы к чему? Покажите пожалуйсто вариант "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее"" НеофитSQLЦикл не подходит, по причине первого критерия. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 18:12 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
PuM256, Да, пример понятный. Приложение может быть написано плохо, сетевое соединение может быть плохим, и т.д. Меня интересует замер скорости исполнения определенного запроса дла базиса (baseline). У меня нет знаний архитектуры приложения, но есть несколько оосновных предположений о его устройстве и есть голова которая позволяет сделать несколько выводов, например: - если jmeter (например) получает совпадающий результат запроса значительно быстрее чем приложение, то существует узкое бесто вне оракла - если jmeter получает совпадающий резалтсет значительно медленнее, то я пропустил важные настройки jmeter которые влияют на производительность - если время примерно одинаковое для jmeter и для приложения, то в худшем случае ошибки настроек совпали :) Я не использовал jmeter для моих замеров. Я исключил влияние настроек клиента, сделав тест через CTAS. Мои результаты на 5% быстрее от наблюдаемого времени исполнения запроса в приложении (что хороший признак, значит клиент без грубых ошибок в этой области), и воспроизводятся с точностью около 2%, что тоже радует. Ради тщательности, я сделал замеры двумя другими методами описанными ранее, результаты совпали. Теперь если я, или кто-то другой, будет делать изменения в этом важном запросе, у меня есть способ измерения и результаты предыдущих замеров для оценки результативности усилий. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 18:27 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev НеофитSQL, это Вы к чему? Покажите пожалуйсто вариант "исполни этот запрос целиком и полностью со всеми известными тебе оптимизациями, и дай мне результат. значение чостовых переменных следующее"" НеофитSQLЦикл не подходит, по причине первого критерия. Чтение резалтсета в цикле "for" как было предложенно происходит заметно медленнее. У меня есть догадки почему это происходит, но независимо от моих догадок цикл тормозит процесс и искажает результаты. Цикл не предлагать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 18:33 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 18:53 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
andrey_anonymous А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах.. Спасибо за подсказку. Вы думаете, я хвастаться сюда прихожу? :) За знаниями, которые иногда приходится клещами.. Я не знал про jmeter, и я не знал про AWR/ASH. Новая для меня область. С jmeter я вроде разобрался, на следующей неделе поковыряю AWR/ASH. Надеюсь, это как раз подойдет для моих целей. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 19:00 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQLЯ не знал про jmeter, и я не знал про AWR/ASH. Новая для меня область. Вообще-то ссылка на AWR - первая в выдаче гугля по запросу "Oracle performance baseline". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 19:15 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Неофит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.
Дальнейшие изыскания чтоб понять разницу можно направить в направлении fetches, rows_processed в v$sql. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 19:19 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
НеофитSQL andrey_anonymous А AWR/ASH отчёты чем не угодили? Тем более если речь о baseline-нах.. Спасибо за подсказку. Вы думаете, я хвастаться сюда прихожу? :) За знаниями, которые иногда приходится клещами.. Я не знал про jmeter, и я не знал про AWR/ASH. Новая для меня область. С jmeter я вроде разобрался, на следующей неделе поковыряю AWR/ASH. Надеюсь, это как раз подойдет для моих целей. Но когда прийдет понимание как таки быть с фетчем и возникнет задача смотреть план выполнения и анализировать куда ушло время, то можешь ознакомиться с dbms_sqltune.report_sql_monitor ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 19:23 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
Кобанчег ознакомиться с dbms_sqltune.report_sql_monitor Решили элегантно подставить коллегу под происки Oracle Legals? 2ТС: warning! в оракеле не каждую кнопку можно трогать руками, не зная, есть ли у конторы подходящая лицензия. Потому что кнопка не только сработает, но и зарегистрирует факт своего срабатывания, который отправится в Oracle corp при ближайшем обращении в поддержку. И dbms_sqltune - одна из таких кнопок. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 19:27 |
|
Замеры скорости запроса SQL
|
|||
---|---|---|---|
#18+
andrey_anonymous Кобанчег ознакомиться с dbms_sqltune.report_sql_monitor Решили элегантно подставить коллегу под происки Oracle Legals? 2ТС: warning! в оракеле не каждую кнопку можно трогать руками, не зная, есть ли у конторы подходящая лицензия. Потому что кнопка не только сработает, но и зарегистрирует факт своего срабатывания, который отправится в Oracle corp при ближайшем обращении в поддержку. И dbms_sqltune - одна из таких кнопок. Если он сделает select * from v$active_session_history уже будет упс без лицензии. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 19:32 |
|
|
start [/forum/topic.php?fid=52&msg=40070364&tid=1880194]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 332ms |
total: | 506ms |
0 / 0 |