|
|
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Oracle 11.2.0.4. Сделал по нескольким таблицам несколько запросов "select count(*) from <table_name>" и просмотрел по ним статистику. Выяснилось следующее: 1) Число обращений к диску примерно равно числу блоков в том из индексов и которого по dba_segments меньше всего блоков; 2) Число блоков индекса на 0,5% - 2,8% больше числа обращений к диску; 3) Число листьев в соответствующих индексах leaf_blocks составляет примерно 20% от общего числа, и при этом blevel везде равен 2. Число блоков в индексах было диапазоне 30 тыс - 900 тыс. Статистика в сессии собиралась включением: "set autotrace on statistics". Размеры таблиц в блоках на порядок больше размеров индексов. Судя по плану запросов - каждый раз идет именно фулл скан индексов. Собственно вопросы: 1) Это совпадение, что число обращений к диску так совпадает с числом блоков самого "компактного" индекса? 2) Если получение count(*) из таблицы делается по компактному индексу, то почему не достаточно было добраться до первого листа, а затем только по ним вести пересчет сократив время почти в 2 раза (при blevel = 2 это было бы равно числу блоков + 3),разве листья не ссылаются на следующий элемент в цепочке? 3) Можно ли каким-нибудь образом уменьшить число обращений к диску для таких запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 14:20 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxсовпадает с числом блоков самого "компактного" индексаCовпадение. Построй регулярный индекс по полю, где большинство значений null. Он будет самым компактным. helgisbox не достаточно было добраться до первого листаНе внятно кому-куда достаточно добраться. По количеству логических чтений, достаточно пройти по листам - IFS, но это одноблочные чтения. IFFS дешевле по io. Хотя на ssd, не отягощенном префетчами, последовательное или случайное чтение - без разницы. helgisbox3) Можно ли каким-нибудь образом уменьшить число обращений к диску для таких запросов?Да. количество обращений к диску можно сократить до нуля. Просто не считать бесполезные count(*). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 14:34 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
explain planhelgisboxсовпадает с числом блоков самого "компактного" индексаCовпадение. Построй регулярный индекс по полю, где большинство значений null. Он будет самым компактным. helgisbox не достаточно было добраться до первого листаНе внятно кому-куда достаточно добраться. По количеству логических чтений, достаточно пройти по листам - IFS, но это одноблочные чтения. IFFS дешевле по io. Хотя на ssd, не отягощенном префетчами, последовательное или случайное чтение - без разницы. helgisbox3) Можно ли каким-нибудь образом уменьшить число обращений к диску для таких запросов?Да. количество обращений к диску можно сократить до нуля. Просто не считать бесполезные count(*). 1. Стало быть, если он даже в план включил этот индекс, то он знал, что поле не может принимать значения null или является ключевым. 2. У меня не SSD случай. 3. Если не count(*), то что будет полезным для получения числа строк таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 15:30 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisbox3. Если не count(*), то что будет полезным для получения числа строк таблицы? Зависит от того, насколько важна точность и как часто собирается статистика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 15:39 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
tru55helgisbox3. Если не count(*), то что будет полезным для получения числа строк таблицы? Зависит от того, насколько важна точность и как часто собирается статистика. Раз в сутки, нужно просто видеть динамику. Иногда существенные изменения связаны с определенными регламентами, которые нужно корректировать. В оперативных таблицах это не так заметно, а вот данные с накоплением - там видно. Смущает, когда такой запрос своим фуллсканом по индексу минут пять держит пачку распараллеленных запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 15:48 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 15:59 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Shtock, авторOracle 11.2.0.4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 16:34 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
dba_tab_modification ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 18:35 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Shtockdba_tab_modification Код: plaintext 1. 2. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 19:07 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxСмущает, когда такой запрос своим фуллсканом по индексу минут пять держит пачку распараллеленных запросов. Мнээ... Вот с этого места поподробнее - что тут как кого держит? А по существу, если точность и своевременность не [очень] важна, то можно ещё вот так: init.ora: Код: sql 1. 2. Код: plsql 1. 2. 3. 4. 5. и обновлять раз в сутки ночью или ранним утром в бэкграунде. Тогда select count(*) from <table> будет выполняться вообще мгновенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 00:02 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z.и обновлять раз в суткине только обновлять, но селектить раз в сутки helgisboxРаз в сутки, нужно просто видеть динамику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 00:16 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxРаз в сутки, нужно просто видеть динамику. Как вариант, sample_clause: https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10002.htm#i2065953 Нужно будет подбирать размер и оценивать точность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 02:00 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Спасибо всем откликнувшимся. В принципе - скорость отработки запроса не критична. Есть какой-нибудь флаг оптимизатору, чтобы он распараллеливал конкретно в таком запросе не по дефолту, а всего на 2 - 4 процесса сам запрос? В принципе - будет все равно, даже если он отрабатывать будет полчаса. Он же таблицу на "апдейты и инсерты" в такое время не лочит ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 09:46 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxне лочитзато параллель сбрасывает грязные буферы на диск и затем физически читает. Производительность других операций может существенно просесть на системе со слабым io. Если таблиц много, лучше запускать несколько джобов по подмножеству таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 10:25 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Почему в указанных условиях не использовать результаты штатного сбора статистики? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 12:21 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
2andrey_anonymous так имеешь ввиду?: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 16:11 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxЕсть какой-нибудь флаг оптимизатору, чтобы он распараллеливал конкретно в таком запросе не по дефолту, а всего на 2 - 4 процесса сам запрос? Хинт PARALLEL принимает в качестве аргумента DOP (degree of parallelism), так что если написать, скажем, Код: plsql 1. , то 4 параллельных процесса (+QC) этот запрос и будут выполнять. А NOPARALLEL вообще запретит выполнять запрос параллельно, равно как и Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 17:14 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z.А NOPARALLEL вообще запретит выполнять запрос параллельно, равно как и Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно. Ну как бы случаи разные бывают =) Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2017, 17:34 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxtru55пропущено... Зависит от того, насколько важна точность и как часто собирается статистика. Раз в сутки, нужно просто видеть динамику. Иногда существенные изменения связаны с определенными регламентами, которые нужно корректировать. В оперативных таблицах это не так заметно, а вот данные с накоплением - там видно. Смущает, когда такой запрос своим фуллсканом по индексу минут пять держит пачку распараллеленных запросов. не мучай базу - смотри в статистику ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 00:52 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Bobby Z.А NOPARALLEL вообще запретит выполнять запрос параллельно, равно как и Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно. Ну как бы случаи разные бывают =) Код: plsql 1. А зачем? И какой DOP будет? А если я после этого в той же сессии сделаю Код: plsql 1. то тогда что будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 21:07 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z. Код: plsql 1. к слову такая "параллель" может быть быстрее чем при таком же но не параллельном плане за счет безусловных direct path reads в отличие от adaptive serial direct path reads :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 21:45 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z.AlexFF__|пропущено... Ну как бы случаи разные бывают =) Код: plsql 1. А зачем? И какой DOP будет? А если я после этого в той же сессии сделаю Код: plsql 1. то тогда что будет? Ты хочешь, чтобы я за тебя проверил? Мне не надо, я знаю как это работает ) А вот ты с помощью тестов мог бы увидеть, как форсирование parallel dml позволяет системе самой определить DOP на твоей "непараллеливаемой" таблице с ALTER TABLE TAB NOPARALLEL; Если конечно система решит параллелить, чего, впрочем, не трудно добиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 23:04 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z. Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно.ну это не правда... простенький пример: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. результат Код: 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. nb: это не параллельный дмл! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 23:57 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Bobby Z.пропущено... А зачем? И какой DOP будет? А если я после этого в той же сессии сделаю Код: plsql 1. то тогда что будет? Ты хочешь, чтобы я за тебя проверил? Мне не надо, я знаю как это работает ) А вот ты с помощью тестов мог бы увидеть, как форсирование parallel dml позволяет системе самой определить DOP на твоей "непараллеливаемой" таблице с ALTER TABLE TAB NOPARALLEL; Если конечно система решит параллелить, чего, впрочем, не трудно добиться.Ну молодец, что знаешь. Хотя тогда должен бы знать, что тут и проверять нечего и тесты никакие не нужны, и форсирование parallel dml ну никакой совершенно роли не играет в этом случае. Или я не понял что "это" ты знаешь как работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 01:08 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
xtenderBobby Z. Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно.ну это не правда... Код: plsql 1. Ну нет, мы так не договаривались..! AutoDOP до сих пор вообще не упоминался, ОП не привёл вообще никаких parallel* параметров, то есть считаем, что всё по умолчанию, а по умолчанию в 11.2.0.4 parallel_degree_policy=manual. AutoDOP это вообще отдельная, длинная и грустная песня, не к ночи будь помянута (и Ваш пример тому лишнее подтверждение). Так что давайте не будем меряться. А ты вы тут уже начали изгаляться кто знает круче способ нае..ть заставить Оракл что-то выполнить или не выполнить параллельно (да и я вместе с вами, не удержался :) ). Здорово, конечно, что вы тут все такие опытные и разных фокусов умеете, но как это помогает ОП? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 01:46 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z.А ты вы...=> А то вы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 01:48 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
xtendernb: это не параллельный дмл!так откуда ему взяться. vldbA DML statement can be parallelized only if you have explicitly enabled parallel DML in the session or in the SQL statement. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 02:41 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z.AlexFF__|пропущено... Ты хочешь, чтобы я за тебя проверил? Мне не надо, я знаю как это работает ) А вот ты с помощью тестов мог бы увидеть, как форсирование parallel dml позволяет системе самой определить DOP на твоей "непараллеливаемой" таблице с ALTER TABLE TAB NOPARALLEL; Если конечно система решит параллелить, чего, впрочем, не трудно добиться.Ну молодец, что знаешь. Хотя тогда должен бы знать, что тут и проверять нечего и тесты никакие не нужны, и форсирование parallel dml ну никакой совершенно роли не играет в этом случае. Или я не понял что "это" ты знаешь как работает? Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:55 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение. на скоко "потоков" распараллелил из плана можно узнать? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 11:55 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
StaxAlexFF__|Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение. на скоко "потоков" распараллелил из плана можно узнать? ..... stax Система сама решает, на моей БД Код: plsql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 12:03 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Staxпропущено... на скоко "потоков" распараллелил из плана можно узнать? ..... stax Система сама решает, на моей БД Код: plsql 1. 2. 3. 4. 5. 6. 7. спасибо, понял где смотреть ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 12:19 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Bobby Z.пропущено... Ну молодец, что знаешь. Хотя тогда должен бы знать, что тут и проверять нечего и тесты никакие не нужны, и форсирование parallel dml ну никакой совершенно роли не играет в этом случае. Или я не понял что "это" ты знаешь как работает? Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение. Код: plsql 1. Ой, как я люблю вот таких напыщенных самонадеянных всезнаек, круче которых только варёные яйца. :) Ну исполать те, многограмотный ты наш Капитан Очевидность, показал нам, неучам, что делает force parallel, что б мы делали вообще без тебя, Кэп... Теперь погугли event 10384, level 16384 - может откроешь для себя, что план выполнения запроса не всегда соответствует тому, как он на самом деле выполняется (другими словами, карта местности не есть сама местность). Хотя, учитывая вот это: AlexFF__|staxна скоко "потоков" распараллелил из плана можно узнать? Система сама решает, на моей БД ... 16непохоже, чтоб ты на самом деле знал, как "это" работает, иначе знал бы, хотя бы в простых случаях, как "система сама решает". Ничего не зная о вот этой твоей БД, рискну предположить, что она не кластеризована, parallel_degree_policy=manual, resource manager не активен, остальные parallel* параметры по умолчанию. Тогда она, скорее всего, бегает на 8-ми ядрах (cpu_count=8). Угадал? И, кстати, запланированный DOP можно из плана узнать, из V$SQL_PLAN.OTHER_XML. V$SQL.PX_SERVERS_EXECUTIONS немного не про то (точнее, вообще не про то). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 00:40 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Bobby Z.И, кстати, запланированный DOP можно из плана узнать, из V$SQL_PLAN.OTHER_XML. V$SQL.PX_SERVERS_EXECUTIONS немного не про то (точнее, вообще не про то). И опять приходится поправлять малограмотных персонажей. Именно потому, что даже параллельный план может выполняться в один поток (например выбран весь parallel_max_servers), реальное число потоков пишется в V$SQL.PX_SERVERS_EXECUTIONS. P.S. Ты не стесняйся, пиши еще, если что непонятно =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 10:01 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|реальное число потоков пишется в V$SQL.PX_SERVERS_EXECUTIONS. Лезу в v$px_session, вижу degree=32, req_degree=32. Смотрю v$sql.px_server_executions - 31. Прокомментируете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 17:48 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousAlexFF__|реальное число потоков пишется в V$SQL.PX_SERVERS_EXECUTIONS. Лезу в v$px_session, вижу degree=32, req_degree=32. Смотрю v$sql.px_server_executions - 31. А с этим как быть? Лезу в v$px_session, вижу degree=16, req_degree=16. Смотрю v$sql.px_server_executions = 7004 Ы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 17:52 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousА с этим как быть?А что неясно?RTFMTotal number of executions performed by parallel execution servers (0 when the statement has never been executed in parallel)Алекса слегка занесло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 17:57 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
[quot Elic]andrey_anonymousА с этим как быть?А что неясно?RTFM Да все как бы ясно. Не сдержался :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 18:24 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
ElicАлекса слегка занесло.Слегка? А мне сослепу показалось, что он вообще поворота не заметил... :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 03:43 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|P.S. Ты не стесняйся, пиши еще, если что непонятно =)Да ладно, чо уж, ты и так достаточно наобъяснял, чтоб я к тебе больше не прислушивался ещё лет несколько пока ты опыта набираешься, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 03:49 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
да всем уже тут хватит чепуху писать... Staxна скоко "потоков" распараллелил из плана можно узнать?лучше всего смотреть в отчет RTSM(real time sql monitor'a), т.е. px_servers_requested,px_servers_allocated,px_maxdop в v$sql_monitor (параллельные выполнения всегда туда попадают без учета "_sqlmon_threshold") там и причина даунгрейда будет, а при отладке/дебаге - в v$pq_sesstat или если совсем глубоко то врубать px_trace 1. про v$sql_plan.other_xml - это тупо для плана этого чайлда, а реальное выделение слейвов происходит в рантайме, соответственно один и тот же чайлд мог в разное время выполняться с разными доп (не будем усложнять про v$sql_plan_statistics_all.last_xxx + statistics_level, так как это все равно не работает с реально параллельными планами, т.к. туда попадают статистики координатора) 2. про v$sql.px_servers_executions - andrey_anonymous уже тоже подсказал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 04:23 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
xtenderлучше всего смотреть в отчет RTSM(real time sql monitor'a) Это все хорошо, вот только монитор не всегда включен по умолчанию, да и отчеты доступны не долго. А вот что однократный запрос может писать неверные значения в v$sql.px_servers_executions, это интересно. Если ты или andrey_anonymous приведете кейс - буду благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 09:34 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|, уровень параллельности потом можно узнать из dba_hist_active_sess_history = px_flags/2097152 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 09:56 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
pihelAlexFF__|, уровень параллельности потом можно узнать из dba_hist_active_sess_history = px_flags/2097152 Ты точно читал мой вопрос? AlexFF__|А вот что однократный запрос может писать неверные значения в v$sql.px_servers_executions, это интересно. Если ты или andrey_anonymous приведете кейс - буду благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:03 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__| однократный запросну начались прыжки в стороны... AlexFF__|неверные значения в v$sql.px_servers_executionsзначит ты так и не понял, про что тебе намекали.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:28 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
xtenderAlexFF__| однократный запросну начались прыжки в стороны... AlexFF__|Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение. ... Код: sql 1. 2. 3. 4. 5. xtenderзначит ты так и не понял, про что тебе намекали.... Я начинаю подозревать тебя в пустословии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:33 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|, ох, тяжкий ты человек... еще раз: v$sql агрегирует для чайлда... у тебя кстати в примере их было 3, хотя и два из них были с одинаковыми планами. И если ты еще не сталкивался, то иногда оракл для одного параллельного выполнения создает несколько чайлдов... AlexFF__|Ок, потрачу пару минут, ак чему это было я вообще не понимаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:51 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
я бы еще понял, если бы ты сразу четко добавил "для однократного выполнения" когда советовал, но сейчас это реально выглядит как прыжки в сторону... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:54 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|pihelAlexFF__|, уровень параллельности потом можно узнать из dba_hist_active_sess_history = px_flags/2097152он то тебе чем не угодил? уж из шаред пула твой одиночный запуск раньше вымоет чем из ash... только чуть правильнее с trunc: https://www.freelists.org/post/oracle-l/detect-parallel-queries-that-have-been-serialized,3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 12:03 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
xtenderк чему это было я вообще не понимаю... Все, что я сделал в топике, это поправил: Bobby Z. Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно. Потом привел тест со специально разными sql_id: Код: sql 1. 2. 3. 4. 5. И на вопрос, как я в этих тестах узнавал реальные параллели, ответил про px_servers_executions. И в ответ от вас я узнал: что значения в v$sql агрегируются существует sql monitor ash попадает в историю Ну ок, полезная информация, только зачем она здесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 12:16 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|, ладно-ладно... брейк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 12:25 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Все, что я сделал в топике, это поправил: Bobby Z. Код: plsql 1. приведёт к тому, что запросы без хинтов будут выполняться последовательно. Не поправил, а подловил искусственным и не очень уместным примером с force parallel, который я парировал ещё более искусственным event 10384. Отвечал я на простой вопрос: есть какой-то флаг оптимизатору, чтоб он распараллеливал с заранее заданной степенью параллелизма? DEGREE объекта - как раз такой флаг, оптимизатор принимает его во внимание при рассчёте степени параллелизма в нормальных условиях по умолчанию (а других задано не было). Ваши собственные эксперименты, приведённые в топике, это неоднократно подтвердили, когда вы показывали "нормальный случай по умолчанию" и потом "ненормальный" со всякими alter session. Можно ли заставить оптимизатор игнорировать degree объектов? Конечно, кучей способов - у атрибута самый низкий приоритет при вычислении dop. Но такой вопрос никто не задавал и непонятно, зачем надо было на него отвечать, да ещё в такой невежливой манере. Чтобы в конечном итоге показать, что "я знаю как это работает" - преувеличение? Ну показал... И обратите внимание, что я написал про посчитанный dop, который можно узнать из плана. Реальный из плана узнать нельзя, ибо, повторюсь, карта местности не есть сама местность. Вы уже обсуждаете откуда узнать dop времени исполнения, то есть, опять отвечаете не на заданный вопрос, а на похожий другой. Тема сложная и интересная, но ТС вообще никаким боком не помогает, по-моему. Сомневаюсь, что ТС вообще этот срач читает. =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 18:52 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Много интересного узнал, спасибо! А вот такой еще есть вопрос. Время от времени некоторые процессы распараллеливаются на 32 сессии. Распараллеливание - это чтобы сделать лучше и быстрее при наличии избытка ресурсов. Но вот если для одной сессии создали 32, а ядер всего 32 и почти все они "пашут". Если появится еще одна пользовательская сессия, полезная, от сервера приложений или от клиента, кто-нибудь из тех, кто параллельно запустился "уступят" ей место. Есть какая-нибудь "выталкивающая" производительность в пользу сессий от клиента, а уже потом только утилизация ресурсов с целью улучшения ответа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2017, 14:22 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxМного интересного узнал, спасибо! А вот такой еще есть вопрос. Время от времени некоторые процессы распараллеливаются на 32 сессии. Распараллеливание - это чтобы сделать лучше и быстрее при наличии избытка ресурсов. Но вот если для одной сессии создали 32, а ядер всего 32 и почти все они "пашут". Если появится еще одна пользовательская сессия, полезная, от сервера приложений или от клиента, кто-нибудь из тех, кто параллельно запустился "уступят" ей место. Есть какая-нибудь "выталкивающая" производительность в пользу сессий от клиента, а уже потом только утилизация ресурсов с целью улучшения ответа? "Это фантастика" (С) )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2017, 15:30 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxМного интересного узнал, спасибо! Есть какая-нибудь "выталкивающая" производительность в пользу сессий от клиента, а уже потом только утилизация ресурсов с целью улучшения ответа?Есть Resource Manager с его consumer groups и планами распределения ресурсов, но в плане вычислительных ресурсов (CPU) он умеет только тормозить процессы, заставляя их ждать часть времени по специальному ожиданию "resmgr: cpu quantum", что не совсем разнозначно "выталкиванию". Надо очень чётко понимать, как именно ResMan "управляет" потреблением CPU и как его использование влияет на время отклика, особенно на нагруженных системах (со средней загрузкой CPU выше 30%). Да и на ненагруженных тоже. Плюс там довольно много неприятных багов было в разное время, так что от версии тоже зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2017, 18:29 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
Какая печаль, получается, что вспомогательное средство оказалось то самой лопатой, нет - граблями, которая и по тебе... Версия 11.2.0.4. Если parallel_max_servers выставить с таким расчетом, чтобы оставалось гарантировано какое-то количество сессий для обычных прикладных запросов, до за пределы parallel_max_servers это "помощь" не уйдет? То есть, к примеру, при 32 ядрах, сделать parallel_max_servers = 25, чтобы гарантировано 8 ядер всегда были для обычных запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2017, 15:13 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxКакая печаль, получается, что вспомогательное средство оказалось то самой лопатой, нет - граблями, которая и по тебе... Версия 11.2.0.4. Если parallel_max_servers выставить с таким расчетом, чтобы оставалось гарантировано какое-то количество сессий для обычных прикладных запросов, до за пределы parallel_max_servers это "помощь" не уйдет? То есть, к примеру, при 32 ядрах, сделать parallel_max_servers = 25, чтобы гарантировано 8 ядер всегда были для обычных запросов? 24 разумеется, опечатка ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2017, 15:14 |
|
||
|
Каким образом выполяется count(*) и как его можно потимизировать
|
|||
|---|---|---|---|
|
#18+
helgisboxчтобы гарантированоВсе значительно иначе. Рассуждать о гарантированности в отрыве от реальной нагрузки и железа бессмысленно. В расчетах дефолтных параметров параллелизма оракл обычно ориентируется на удвоенное количество ядер. Но есть еще ориентир parallel_io_cap_enabled, который играет рояль в сочетании с calibrate_io. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2017, 16:38 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1884815]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 500ms |

| 0 / 0 |
