|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
Доброе время суток! Есть партиционированная таблица с локальным непрефиксным индексом: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Статистика по партиции 1002 посчитана: Код: plsql 1. 2. 3. 4. 5. 6. 7.
В данной партиции более двух миллионов строк и более 40 тысяч различных значений datetime. Почему при выполнении запроса: Код: plsql 1. 2. 3.
не используется индекс IDX_21? Вот план запроса: Код: plsql 1. 2. 3. 4. 5.
Казалось бы гораздо проще всего просмотреть одну ветку партиции индекса, но оптимизатор говорит, что проще пробежаться по всей партиции таблицы. Если указать условие, на конкретное время: Код: plsql 1. 2. 3. 4.
то судя по плану запроса просматривается конкретная партиция индекса, что верно: Код: plsql 1. 2. 3. 4. 5.
Я попробовал создать префиксный индекс, и тогда он уже подхватывается при вычислении max(tradetime). Но почему не подхватывается НЕпрефиксный? Я раньше не замечал подобного. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 21:49 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
ха-хаха сколько умных слов и разбора, а толку... Потому что отбор идёт по полю, где нет индекса: Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 23:40 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
Fogel, Индекс локально партиционированный, поэтому условием part_id = 1002 однозначно определяется требуемая партиция индекса, а дальше всего-лишь нужно пройтись по одной ветке B-дерева этой партиции, чтобы найти максимальное значение. Ps: почитайте про партиционированные индексы, например, в книге Тома Кайта. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 00:09 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
Fogelха-хаха сколько умных слов и разбора, а толку... Потому что отбор идёт по полю, где нет индекса: Код: plsql 1.
и что? нужная секция известна, индекс локальный, то есть секция индекса тоже известна. максимум берется от индексированного поля. желание прочитать одну ветку секции индекса вместо секции таблицы вполне понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 00:13 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
Андрей_7777Но почему не подхватывается НЕпрефиксный? Я раньше не замечал подобного. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 01:12 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
Ах да, Код: 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.
Собственно, обратите внимание на projection (livesql что-то бастует, сделайте самостоятельно). С LIST я не особо возился, но для RANGE и HASH помимо pruning безусловно потребовался бы фильтр на part_id = 1002. Видимо, даже с LIST SINGLE действует общее правило - pruning не отменяет filtering. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 01:20 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymousВидимо, даже с LIST SINGLE действует общее правило - pruning не отменяет filtering. Хотя по-хорошему это, конечно, баг оптимизатора. Посмотрите на статистики сессии при выполнении Код: plsql 1. 2. 3.
и обнаружите, что оптимизатор сильно перезаложился, выдав из-под "first row" все 102K :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 01:37 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
Андрей_7777, нужно хинтануть: Код: plsql 1.
оптимизатор тут что-то глючит нехило: один из примеров, когда CBO выбирает план с более высоким Cost 11.2.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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
11.2.0.2 hinted Код: 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.
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.
12.2.0.1 hinted Код: 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.
18.4 Код: 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.
18.4 hinted Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 01:42 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtenderоптимизатор тут что-то глючит нехило: один из примеров, когда CBO выбирает план с более высоким Cost Код: plsql 1.
Не маловато данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:02 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymous, а зачем данные, чтобы увидеть, что выбран план с более высокой стоимостью? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:05 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtenderа зачем данные, чтобы увидеть, что выбран план с более высокой стоимостью? Нууу... Оценка мощности FTS в одну строку как-то не навевает мысли о высокой стоимости... Скорее наоборот :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:14 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymous, 0 больше 2? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:15 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtender0 больше 2? short table scan и прочая эмпирика? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:38 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymousshort table scanэто влияет на другое, уже во время выполнения, не на выбор плана, т.к. проверяется позже для конкретной row-source операции ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:42 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtenderandrey_anonymousshort table scanэто влияет на другое 0 или 1 - это вообще ни о чем - только эмпирика, только хардкор. Посмотри оценки с livesql на 100к записей, FTS дешевле IFS - и это было бы верно, если бы не ошибка в оценке мощности минимаксного IFS + first row ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:51 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymousошибка в оценке мощности минимаксного IFS + first row ...при наличии предиката на PART_ID, без которого оценка корректна (третий вариант) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:57 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymous0 или 1 - это вообще ни о чем - только эмпирика, только хардкор.блин, ну очевидно же из моих примеров, что не рассматривается индексный доступ и не будет выбран хоть какую стоимость ты сгенерируй. Вот тебе для примера: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
и сравни стоимость Код: plsql 1.
с Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 02:59 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtenderandrey_anonymous0 или 1 - это вообще ни о чем - только эмпирика, только хардкор.блин, ну очевидно же из моих примеров, что не рассматривается индексный доступ Из твоих как раз не очевидно :) Более того, ты прямо утверждаешь, что оптимизатор "выбирает план с большей стоимостью", что технически неверно. Посмотри мои - там нагляднее имхо, в т.ч. видна эмпирика (будет или нет рассматриваться индексный доступ - зависит от наличия предиката на PART_ID). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 03:10 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymousxtenderблин, ну очевидно же из моих примеров, что не рассматривается индексный доступ Ну кстати не факт в 18 (или кто там на livesql): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 03:15 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymousБолее того, ты прямо утверждаешь, что оптимизатор "выбирает план с большей стоимостью", что технически неверно.читай внимательно: xtenderодин из примеров, когда CBO выбирает план с более высоким CostТы будешь отрицать, что выбран план с большим Cost? Тем более, что ты же был вроде, когда я выступал в РуОУГе с темой, когда и почему оракл не выбирает план с меньшей стоимостью. И это один из очевидных примеров. andrey_anonymousПосмотри мои - там нагляднее имхоты путаешь partition pruning с указанием конкретной секции через partition for. Это разные механизмы и, в общем, случае очевидно, что при указании секции через partition for и добавлении предиката, нужен будет отфильтровать записи по предикату. Попробуй, например, захинтовать индексный доступ в своем запросе: partition for без хинта Код: 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.
partition for с хинтом Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 03:46 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymousНу кстати не факт в 18 (или кто там на livesql):что ты имеешь ввиду? Я же показал, что без хинта IFS(min/max) выбран не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 03:47 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtenderandrey_anonymousБолее того, ты прямо утверждаешь, что оптимизатор "выбирает план с большей стоимостью", что технически неверно.читай внимательно: xtenderодин из примеров, когда CBO выбирает план с более высоким CostТы будешь отрицать, что выбран план с большим Cost? 1. Меня убедит только 10053, где будет рассмотрено два плана и выбран более дорогой. Все остальное - от лукавого, ибо самого факта _выбора не было, если, к примеру, индексный доступ по каким-либо причинам не рассматривался . 2. Я же показал, что согласно оценке оптимизатора на непустой таблице FTS дешевле. xtenderты путаешь partition pruning с указанием конкретной секции через partition for. Это разные механизмы и, в общем, случае очевидно, что при указании секции через partition for и добавлении предиката, нужен будет отфильтровать записи по предикату. Похоже, что путаешь ты. Смотри внимательно. Я показал, что, избавившись от предиката (заменив его partition for) в случае PARTITION LIST SINGLE (это важно ) удалось привести CBO в состояние, в котором он смог дать адекватную оценку минимаксному скану индекса. Ты же не будешь утверждать, что минимаксный поиск тождественен IFS/IFS? При этом возвращение предиката вернуло и проблемы с оценкой (дальше). Тут все немного сложно - CBO не всегда адекватно реагирует даже на два предиката с partition key, а именно, если поведение не изменилось со старинных времен, использует для partition pruning первый из встреченный предикатов и игнорит второй. А в приведенном примере "условно конфликтуют" partition for и предикат - ХЗ как индусы разрулили такой пердимонокль. xtenderПопробуй, например, захинтовать индексный доступ в своем запросе: Да без проблем: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
у тебя просто ошибка в хинте xtender Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 05:40 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
xtenderandrey_anonymousНу кстати не факт в 18 (или кто там на livesql):что ты имеешь ввиду? Я же показал, что без хинта IFS(min/max) выбран не будет Я имею ввиду, что 3235 > 124 - следовательно, CBO выбирает более дешевый план и нет причин подозревать его в халатности, пока иное не будет доказано 10053. Одновременно я имею ввиду, что оценка 3235 для IFS(MIN/MAX) - ложна. В этом легко убедиться, посчитав логические чтения хинтованного запроса хотя бы через sessstat. Естественно, при проведении подобного измерения следует исключить dynamic sampling :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 05:49 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymous1. Меня убедит только 10053, где будет рассмотрено два плана и выбран более дорогой. Все остальное - от лукавого, ибо самого факта _выбора не было, если, к примеру, индексный доступ по каким-либо причинам не рассматривался .я прямым текстом и сказал, что более дешевый индексный доступ не рассматривается, приведя пример изначально и отдельно еще один(с данными) тут: 21801644 xtenderandrey_anonymous0 или 1 - это вообще ни о чем - только эмпирика, только хардкор.блин, ну очевидно же из моих примеров, что не рассматривается индексный доступ и не будет выбран хоть какую стоимость ты сгенерируй. Вот тебе для примера: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
и сравни стоимость Код: plsql 1.
с Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 05:52 |
|
Не используется партиционированный индекс при выполнении запроса
|
|||
---|---|---|---|
#18+
andrey_anonymous2. Я же показал, что согласно оценке оптимизатора на непустой таблице FTS дешевле.да по барабану, что в твоем примере он дешевле. Я показал, что безотносительно стоимости, индексный доступ выбран не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 05:53 |
|
|
start [/forum/topic.php?fid=52&fpage=85&tid=1882832]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
others: | 340ms |
total: | 500ms |
0 / 0 |