|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
Здравствуйте! Помогите, пожалуйста, разобраться в ситуации. Код: plaintext 1. 2. 3. 4. 5.
Есть самый простой запрос: Код: plsql 1.
У таблицы есть индекс Код: plsql 1.
Таблица T_LOG - таблица логирования действий пользователей. Т.е. днём данные в ней интенсивно накапливаются, а ночью старые (больше месяца) данные удаляются. Ситуация. Данный запрос прекрасно работает в SQL - оптимизатор индекс автоматом определяет. А вот в PL/SQL - TABLE ACCESS FULL. Явно хинтом указал индекс - а оптимизатору по барабану. Пересобрал статистику, пересоздал индексы - ситуация та же. И только после пересоздания самой таблицы T_LOG - всё заработало. Вопрос: какого фига? Что нужно делать, чтобы избежать такой ситуации в будущем? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2021, 23:50 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
Думаю, эффективней было бы сделать индекс по (code,dt) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 01:51 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND Ситуация. Данный запрос прекрасно работает в SQL - оптимизатор индекс автоматом определяет. А вот в PL/SQL - TABLE ACCESS FULL. Явно хинтом указал индекс - а оптимизатору по барабану. Это вы как определили? В любом случае, планы в студию. И код на SQL и PL/SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 09:10 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
PuM256, С трассировкой и с запросами всё нормально, всё перепроверял несколько раз - проблема не в этом. Запрос самый простой(при исследовании довёл до указанного выше запроса) и планы соответственно, тоже. Меня пугает, что после пересоздания таблицы(сбор статистики, пересоздание индексов не помогало), без изменения кода, всё заработало корректно. План в PL/SQL стал с индексом ( как и в SQL) Т.е. с таблицей что-то случилось. Но что? (Коль в SQL всё нормально работало) Как перестраховаться чтобы в дальнейшем не попасть на эту ситуацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 10:39 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND Как перестраховаться чтобы в дальнейшем не попасть на эту ситуацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 12:07 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND, Повторю вопрос - каким способом вы смотрите план в SQL и в PL/SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 13:28 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
PuM256, PL/SQL снимал трассировку SQL строил план в девелопере. Да и без трассировки в девелопере явно ощущалось. SQL отрабатывает моментально. Тот же запрос, вызываемый в скрипте Код: plsql 1. 2. 3.
- зависал на минуты ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 13:58 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND Тот же запрос, вызываемый в скрипте Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:09 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
AmKad, нет. Подставлял явно значение - не помогало. И опять-таки, после пересоздания таблицы всё заработало правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:15 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND И опять-таки, после пересоздания таблицы всё заработало правильно. Тест с execution plan в студию. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:26 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
Текущий план скрипта PL/SQL Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:34 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
План до пересоздания таблицы Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Ещё раз обращу внимание что явно хинтом подсовывал индекс Код: plsql 1.
- оптимизатор его не брал ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:42 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
А access/filter predicates? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:44 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND, На вопрос "почему такой план" гораздо лучше отвечает трасса 10053, а не 10046. Но для начала всё-таки, как уже верно указали, хотелось бы взглянуть на план с предикатами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 14:49 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND План до пересоздания таблицы Код: plsql 1.
Текущий план скрипта PL/SQL Код: plsql 1.
1 строка - чтение индекса + 1 чтение 1 блока таблицы. 11 строк - чтение индекса + до 11 чтений по 1 блоку таблицы. Оптимизатор решил full scan который читает не по 1 блоку таблицы а по multiblock_read_count блоков дешевле. Правильно решил или нет - смотреть трейс + статистика. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 15:17 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND, Не сходится: A_-_NDУ таблицы есть индекс index T_LOG_I1 on T_LOG (CODE) И: A_-_NDINDEX FULL SCAN T_LOG_I1 С чего-бы оптимизатор читал весь индекс если имеем WHERE B.CODE = PCODE? Ну и: A_-_NDЕсть самый простой запрос: select max(DT) from T_LOG where CODE = :p_code; A_-_NDТекущий план скрипта PL/SQL Код: plsql 1. 2. 3.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 15:42 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
SY Не сходится: Да, есть такое. В конце привёл планы боевых запросов. А в начале привёл упрощённые запросы к таблице, с которыми работал и пытался разобраться откуда тормоза идут. Почему запрос из PL/SQL тормозит, а из SQL работает прекрасно? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 18:55 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
PuM256 гораздо лучше отвечает трасса 10053, а не 10046. Но для начала всё-таки, как уже верно указали, хотелось бы взглянуть на план с предикатами. Увы, этих планов нет ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 18:56 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND Почему запрос из PL/SQL тормозит, а из SQL работает прекрасно? Потому что пока ты преуспел в невольном сокрытии/подтасовке. Для начала приведи DDL создания таблицы и ее всех индексов, констрейнтов, триггеров итд. Приведи точный SQL и тип данных PCODE ибо это первый подозреваемый: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А теперь сравни: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 21:00 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND, Ну и то что INDEX FULL SCAN T_LOG_I1 настойчиво намекает что индекс T_LOG_I1 на более чем CODE и CODE не первая колонка: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 21:14 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
SY, Уверен, что проблема не в параметре. После пересоздания таблицы(тем же скриптом), без изменения кода, запрос стал работать корректно. Ладно, таблицу уже пересоздал. Проблемы сейчас нет. Буду мониторить. Надеюсь больше не стрельнёт. Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2021, 21:23 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
Я иногда сталкиваюсь с подобной ситуацией, когда план запроса "ломается". При этом, если взять SQL-текст и выполнить отдельно - план нормальный, но при запуске этого же текста из приложения/отчёта - запрос дико тормозит. Если его отловить среди запущенных и посмотреть план - то видно, что "кривой". Помогает удаление "кривого" плана из кэша запросов ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 01:21 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND SY, После пересоздания таблицы(тем же скриптом), без изменения кода, запрос стал работать корректно. Я бы так однозначно не утверждал. INDEX FULL SCAN - не самый лучший метод, как правило. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 09:32 |
|
Индекс работает в SQL, но не работает в PL/SQL
|
|||
---|---|---|---|
#18+
A_-_ND SY, Уверен, что проблема не в параметре. После пересоздания таблицы(тем же скриптом), без изменения кода, запрос стал работать корректно. Ладно, таблицу уже пересоздал. Проблемы сейчас нет. Буду мониторить. Надеюсь больше не стрельнёт. Всем спасибо! Научитесь, плииз, грамотно и точно задавать вопросы и давать точные исчерпывающие ответы на вопросы, которые задают вам. Но это только в том случае, если вы хотите решить проблему, а не просто поговорить ни о чём. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2021, 14:38 |
|
|
start [/forum/topic.php?fid=52&fpage=17&tid=1880091]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 235ms |
total: | 378ms |
0 / 0 |