|
|
|
Каким образом выполяется 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 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1884815]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 450ms |

| 0 / 0 |
