|
|
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток. Прошу совета по следующей проблеме: есть представление на основе инмемори таблицы, в представлении также используются анпивот и группировки. Представление снаружи ограничивается по нескольким полям: по обязательному полю с датой и ещё необязательному типа varchar2. Проблема вылезла очень неожиданным для меня образом: в тексте запроса имеется следующая конструкция (знакомая апексоводам) - Код: plsql 1. 2. при использовании DBMS_SQL мой код выполняется примерно 15с, причём если использовать execute immediate c using'ом, то запрос отрабатывает быстро ~3c. Причём заметил следующее если убрать второе условие или заменить его на Код: plsql 1. то запрос отрабатывает быстро, но если в условии появляется OR, то беда. Я так понимаю, что 15с. это полный перебор всех значений в столбцах, т.е. условие ДК.DOPER = TO_DATE(:P3_DATE, 'DD.MM.YYYY'), не применяется. Почему это происходит я понять не могу. У кого есть идеи по данному поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 15:59 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
mrsergejAND (ДК.CLI_CODE LIKE '%' || :P3_CLI_CODE || '%') а вы уверенны, что вам такое надо при условии ДК.CLI_CODE=12345678 :P3_CLI_CODE=5 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 16:32 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
123ййmrsergejAND (ДК.CLI_CODE LIKE '%' || :P3_CLI_CODE || '%') а вы уверенны, что вам такое надо при условии ДК.CLI_CODE=12345678 :P3_CLI_CODE=5 ? Не очень понял, честно говоря о чём был вопрос. У кого какие идеи? Очень странно, что запрос ведёт себя таким образом именно при использовании DBMS_SQL. Хотя бы подскажите в какую сторону нужно копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 07:41 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
mrsergejЯ так понимаю, что 15с. это полныйТо есть ты не в состоянии посмотреть актуальные планы выполнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 07:51 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
ElicmrsergejЯ так понимаю, что 15с. это полныйТо есть ты не в состоянии посмотреть актуальные планы выполнения? 15с это полный перебор. Т.к. таблица inmemory, то в плане всегда присутствует TABLE ACCESS INMEMORY FULL (план всегда одинаковый), но при выполнении запроса просто в sql окне или через execute immediate с секцией using запрос отрабатывает быстро. Я так понимаю, что это связано с bind переменными в запросе, а не с наличием OR как я предполагал ранее, т.к. заметил следующую особенность: если использовать вместо bind переменной литерал, то даже с OR запрос отрабатывает быстро, т.е. вместо Код: plsql 1. использовать Код: plsql 1. или Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 09:27 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
Может есть ещё идеи в какую сторону копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 11:42 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
mrsergejМожет есть ещё идеи в какую сторону копать? Копайте в сторону Австралии и вообще задумайтесь в чем сокральный смысл такой конструкции Код: plsql 1. если при :P3_CLI_CODE = null выберутся все значения по условию :P3_CLI_CODE IS NULL и по условию ДК.CLI_CODE LIKE '%' || null || '%' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 12:02 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
MaximaXXLmrsergejМожет есть ещё идеи в какую сторону копать? Копайте в сторону Австралии и вообще задумайтесь в чем сокральный смысл такой конструкции Код: plsql 1. если при :P3_CLI_CODE = null выберутся все значения по условию :P3_CLI_CODE IS NULL и по условию ДК.CLI_CODE LIKE '%' || null || '%' Я сейчас только для Вас открою тайну, можете записать куда-нибудь, чтобы не забыть - при значении :P3_CLI_CODE = null второе условие проверяться даже и не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 12:14 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
IMHO & AFAIK 1 Может выполнятся и не будет, но план портить вполне может.... (т.к. оптимизитор в момент парсинга об этом факте может и не знать) IMHO 2 Ну и вообще, если есть разница в выполнении. то первым делом желательно сравнить планы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 12:25 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
mrsergejЯ сейчас только для Вас открою тайну, можете записать куда-нибудь, чтобы не забыть - при значении :P3_CLI_CODE = null второе условие проверяться даже и не будет Ой не надо мне открывать страшных тайн, а то я даже не уверен что являеться вторым условием для Оракла Единственное что не выберется по условию ДК.CLI_CODE LIKE '%' ||null|| '%' это ДК.CLI_CODE равное null и если у Вас поле "is not null" то как Вы сами и писали "примерно 15с ... быстро ~3c" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 12:41 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevIMHO & AFAIK 1 Может выполнятся и не будет, но план портить вполне может.... (т.к. оптимизитор в момент парсинга об этом факте может и не знать) IMHO 2 Ну и вообще, если есть разница в выполнении. то первым делом желательно сравнить планы. У меня тоже складывается ощущение, что когда оптимизатор на момент парсинга понимает результат в левой части условия (:P3_CLI_CODE IS NULL OR ДК.CLI_CODE LIKE '%' || :P3_CLI_CODE || '%'), то и результат я получаю тот, который ожидаю, но при использовании переменных он не знает, что там будет - истина или ложь и как его заставить использовать обязательное условие (ДК.DOPER = TO_DATE(:P3_DATE, 'DD.MM.YYYY')) при таком варианте не понятно. По поводу планов, я не большой спец в инмемори таблицах, но у меня всегда при использовании этой таблицы одинаковый план. Я не понимаю, почему обязательное условие ДК.DOPER = TO_DATE(:P3_DATE, 'DD.MM.YYYY') применяется не всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 12:51 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
AFAIK по sql_id можно из представлений вытащить реальные планы выполнения Я делал просто: добавлял в запросы какой нибудь комментарий (что бы они отличались), потом по v$sql находил нужный запрос, в v$sql_plan соответственно реальный план, в v$sql_bind???? вроде можно посмотреть реальное значение bind переменных Наверное можно добавить хинты, что бы бы планы совпали IMHO p.s. надеюсь в представлениях не ошибся, при написание ответа не проверял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 13:19 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevAFAIK по sql_id можно из представлений вытащить реальные планы выполнения Первая разумная мысль в данном топике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 14:24 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
Переписать Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 18:19 |
|
||
|
DBMS_SQL странное поведение
|
|||
|---|---|---|---|
|
#18+
Руслан Дамирович, Ваш второй вариант справедлив только для случая если поле ДК.CLI_CODE не имеет значений null Код: plsql 1. 2. пример Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2018, 12:56 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39639341&tid=1884024]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
5ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 486ms |

| 0 / 0 |
