
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
14.07.2017, 09:06
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Всем доброго. Разбираясь с одной проблемой наткнулся на другую, так сказать даже не ожидал и понять не могу что делаю не так. Суть - есть партицированная табличка. По дате партиционирования создан BITMAP index. При извлечении всех данных из двух партиций оракл предлагает использовать созданный bitmap index, но не full scan. Предлагает обоснованно, cost в случае с Bitmap действительно ниже. Но конечно глупость фуллсканить данные используя одноблочное чтение. При этом количество строк оценивается корректно. Стоит 12.1.0.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. Смотрим план: Код: plsql 1. 2. 3. 4. 5. 6. 7. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Прошу обратить внимание на стоимость извлечения 200К строк = 294. Ниже просто для примера. Если кол-во партиций увиливать, то cost падает при пробеге по этому Bitmap т.е. видимо оракл делит кол-во различных значений индекса на общее кол-во строк и как-то эту информацию учитывает в cost. Бага, фича, что-то забыли врубить на базе? Сам я не админ, возможно где-то "крыжик" не стоит. Ваше мнение? Зачем такой индекс не спрашивать, считайте для примера ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 09:28
|
|||
|---|---|---|---|
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Pavel_PV, У тебя в каждой партиции может быть до 86400 различных значений, а ты запрашиваешь только одно. Что тут удивительного? Попробуй гистограммы собрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 09:57
|
|||
|---|---|---|---|
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Pavel_PV, авторИнтересно что делаю не так? авторЗачем такой индекс не спрашивать, считайте для примера ). как то не получается) дата и есть ключ партиционирования ??? и битмап по по ней ? это какое-то особое извращение? Вроде, что многоблочный(direct?) фулл скан секции быстрей - сам понимаешь. Вопрос в том почему оптимизатор это сам не видит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 11:25
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
AlexFF__|Pavel_PV, У тебя в каждой партиции может быть до 86400 различных значений, а ты запрашиваешь только одно. Что тут удивительного? Попробуй гистограммы собрать. Дата транкейчена т.е. по факту 1 различное значение в каждой партиции. Плюс из плана видно, что оракл вполне себе корректно определяет кол-во извлекаемых строк. Гистограммы собирать пробовал, у меня не помогло ). kinky cat , да извращение ещё. Но не поверишь нужно иногда, "bitmap and" отлично работает с этой штукой. Да вопрос больше не в том почему оптимизатор этого сам не видит, а в том что он вместо cost-а рисует какую-то басню. Он реально думает что достанет 200К строк, а cost рисует как будто их там десятки будут. Ниже пример приведу который нагляднее отразит ситуацию. Так сказать раз там ничего удивительного, давай вот такой пример. Создаем табличку так же как писал выше. Далее заполняем 4 партиции: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Собираем статистику и смотрим план вот так, явно укажем хинтом идти по индексу чтобы отследить изменения cost-а: Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Cost = 923, видно что Pstart 15 и Pstop 16. Теперь добавим в таблицу ещё одну партицию: Код: 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. Вроде бы всё так, но cost стал меньше. А так всё то же, партиции теже, строк столько же и байт столько же. Ну давайте ещё одну партицию добавим: Код: plsql 1. Смотрим план: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. При этом всё я следил за изменением cost при фуллскане, первый раз он был 334, потом 335 и потом 336. Т.е. никак не падает, действительно с чего бы ему падать? А cost в данном случае постоянно уменьшается, в один момент он становится меньше чем у full scan и появляется картина которую мы наблюдаем в первом моей сообщении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 11:33
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Если кому-то интересно можно запилить такой же тест, только в качестве колонки для битмап взять не дату партицирования. Но зачем? Если ошибиться при доказательстве теоремы в первой строке, то какой смысл доказывать что-то дальше. Это я о формуле подсчета costa или о том, что где-то забыли что-то включить в оракле или собрать может статистику ещё. Это бы поведение понять и ещё интересно на 11 версии всё так же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 11:37
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
А как статистику собираете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 11:40
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
andrey_anonymousА как статистику собираете? exec dbms_stats.gather_table_stats(ownname => '****',tabname => 'T1'); exec dbms_stats.gather_index_stats(ownname => '****',indname => 'TEST_INDEX1'); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 11:48
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Ни о чем не сказало - не вижу текущих настроек. Попробуйте собирать без глобальной статистики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 12:04
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
andrey_anonymousНи о чем не сказало - не вижу текущих настроек. Попробуйте собирать без глобальной статистики. Какие именно настройки нужны? Без глобальной всё ещё хуже, пробовал. Можно конечно кинуть готовый тест кейс, займёт не более 10 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 12:19
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Pavel_PV, автор Но конечно глупость фуллсканить данные используя одноблочное чтение Код: plsql 1. делает/может делать multiblock reads AlexFF__| У тебя в каждой партиции может быть до 86400 различных значений, а ты запрашиваешь только одно. Что тут удивительного? Попробуй гистограммы собрать Код: plsql 1. у меня на тестовой базе (12.2) план не меняет, так что, думаю, histograms тоже врядли изменят что то. Regards Maxim ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 12:25
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Pavel_PVandrey_anonymousНи о чем не сказало - не вижу текущих настроек. Попробуйте собирать без глобальной статистики. Какие именно настройки нужны? Без глобальной всё ещё хуже, пробовал. Можно конечно кинуть готовый тест кейс, займёт не более 10 минут. Я имел ввиду те, что установлены посредством dbma_stats.SET_%_PREFS Интересовала гранулярность и гистограммы. Есть подозрение, что если добавление данных в новые секции влияет на оценки по существующим - то используется глобальная статистика. Ну и конкретный метод построения гистограммы по проблемному полю тоже хотелось понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 12:31
|
|||
|---|---|---|---|
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Maxim DemenkoAlexFF__| У тебя в каждой партиции может быть до 86400 различных значений, а ты запрашиваешь только одно. Что тут удивительного? Попробуй гистограммы собрать Код: plsql 1. у меня на тестовой базе (12.2) план не меняет, так что, думаю, histograms тоже врядли изменят что то. Maxim Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plsql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 13:25
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
AlexFF__|, 12.2.0.1 Код: 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. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. Это с check constraint. Без него Код: 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. Regards Maxim ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 13:27
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
andrey_anonymous я думаю при сканировании нескольких партиций всегда используется глобальная статистика? ну до 12-ки так было, в 12-ке вроде у них появилась возможность собирать глобальную по партициям. Надо почитать и глянуть включён этот рычаг или нет. Что именно установлено с помощью dbma_stats.SET_%_PREFS в выходные почитаю, если честно с ходу не могу сказать какие именно там параметры. Если нужно запулить пул настроек из конкретной вьюхи не вопрос, а так покурить надо эту тему ибо знаний в этой области маловато. Я просто к тому говорил, что если у тебя этот пример не повторяется то видимо есть смысл сравнить настройки систем, а иначе не совсем понятно что они дадут. AlexFF__|, сделал констрэйнт и собрал статистику как в твоём примере и ничего не изменилось. Так же bitmap. Проверил на своей таблице с 4 партиями, как кост падал так и падает. Можешь подробнее, что именно крутил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2017, 14:20
|
|||
|---|---|---|---|
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Pavel_PVandrey_anonymous я думаю при сканировании нескольких партиций всегда используется глобальная статистика? ну до 12-ки так было, в 12-ке вроде у них появилась возможность собирать глобальную по партициям. Надо почитать и глянуть включён этот рычаг или нет. Что именно установлено с помощью dbma_stats.SET_%_PREFS в выходные почитаю, если честно с ходу не могу сказать какие именно там параметры. Если нужно запулить пул настроек из конкретной вьюхи не вопрос, а так покурить надо эту тему ибо знаний в этой области маловато. Я просто к тому говорил, что если у тебя этот пример не повторяется то видимо есть смысл сравнить настройки систем, а иначе не совсем понятно что они дадут. AlexFF__|, сделал констрэйнт и собрал статистику как в твоём примере и ничего не изменилось. Так же bitmap. Проверил на своей таблице с 4 партиями, как кост падал так и падает. Можешь подробнее, что именно крутил? Да, действительно, гистограммы не причем. Код: plsql 1. 2. 3. 4. 5. На первом примере я схалявил и выполнил без сбора статистики с dynamic sampling used for this statement (level=2) А с твоим сбором сразу идет план с FTS. Надо будет посмотреть 10053. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.07.2017, 08:45
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Проверил на честной 11.2.0.3, ничего не изменилось. Снял 10053, надеюсь туда смотрю. Не совсем понимаю, что это даёт? : Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.07.2017, 12:31
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Проверил вот это: ****** Costing Index TEST_INDEX1 SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_SCAN SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_FILTER Access Path: index (IndexOnly) Index: TEST_INDEX1 resc_io: 8.000000 resc_cpu: 59172 ix_sel: 0.400001 ix_sel_with_filters: 0.400001 Cost: 8.009606 Resp: 8.009606 Degree: 0 Bitmap nodes: Used TEST_INDEX1 Cost = 8.204514, sel = 0.400001 Access path: Bitmap index - accepted Cost: 923.229713 Cost_io: 916.113633 Cost_cpu: 43835051.745941 Sel: 0.400001 Not Believed to be index-only Собственно создал так же табличку, но не 100 партиций а 4 добавил. Как видно Cost пробега по индексу пока выше чем cost фуллскана. У меня возможно глупый вопрос, вот этот Cost: Cost: 923.229713 каким образом получается из Cost = 8.204514, sel = 0.400001 Ну понятно, что что-то где-то умножается. Не понимаю есть ли эти цифры в трэйс файле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.07.2017, 12:44
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Ех...нумс продолжим монолог ). Коллеги думаю дело в следующем. Вот строка из трэйс файла когда партиций много: Cost = 8.204514, sel = 0.019802 А вот она же когда патиций мало: Cost = 8.204514, sel = 0.400001 Sel я так понимаю селективность. Т.е. она падает с увеличением числа партиций, что конечно же вполне логично. Если этот параметр участвует в формировании итогового cost-а через знак "*", то....формулу бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.07.2017, 12:52
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Pavel_PVформулу бы. У Льюиса разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.07.2017, 14:13
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Про селективность что-то я "прогнал", не должна она падать. 1/100 000=2/200 000/=.... В этом наверное и соль? У Льюиса наверное есть в его книжке про СВО. Но я не читал её. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.07.2017, 10:20
|
|||
|---|---|---|---|
|
|||
Одно число строк дешевле выдернуть через bitmap одноблочкой через многоблочкой? |
|||
|
#18+
Ещё покрутил тему пока было время. Вот вырезка из трйэс файла: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Обратил внимание, что PRUNED=2 т.е. оракл понимает, что данные находятся только в 2 партициях. Но количество строк которое он при этом оценивает остаётся таким же как и общее количество строк в таблице т.е. 700 002. Может есть у кого мысли почему? Статистика и гистограммы в наличии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=52&tablet=1&tid=1885527]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 538ms |

| 0 / 0 |
