|
|
|
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
|
|||
|---|---|---|---|
|
#18+
Всем привет Я - быдлокодер, пишу SQL-запросы в Oracle. Недавно обнаружил следующую мозгоразрывающую ситуацию: У меня есть некая несложная вьюха T_VIEW с плоским запросом и был запрос: Код: plsql 1. который работал за 1 сек, причем возвращал 2 строки. Вьюха содержит вызов некой PL/SQL-функции Код: plsql 1. (CNT здесь всегда некое целое неотрицательное число) Я добавил ограничение CNT > 0: Код: plsql 1. в результате запрос стал работать 8 секунд! Время отработки было довольно стабильным и не хотело убиваться никакими попытками выпрыгнуть обратно в зону здравого смысла. 8 сек отрабатывали запросы: Код: plsql 1. 2. 3. Код: plsql 1. 2. 3. Код: plsql 1. 2. 3. 4. и еще некоторые, в том числе использовалась замена вьюхи на ее код, внос предикатов внутрь и т.п. - ничего не помогало! Наконец я вставил в вызов fCnt счетчик, считающий число ее вызовов, и обнаружил, что функция была вызвана примерно 10^5 раз (откуда взялось конкретное число - не посмотрел). Когда дописал к функции слово deterministic (что неправда), тогда число вызовов упало до 2 и результат обнаружился. Пробовал дописывать всякие костыли типа /*+no_parallel*/, /*+choose*/ - эффекта нуль. В итоге я вместо этого написал еще одну функцию на PL/SQL, которая обращалась ко вьюхе через курсор, а условие CNT > 0 вынес в PL/SQL, где оно наконец-то отработало естественным образом. И вот наконец-то вопрос: что это вообще было?! Есть ли вообще хоть какое-то теоретическое объяснение? Меня оно для начала удовлетворило бы вполне. Я всегда думал, что у запросов сначала отрабатывает секция where, потом select (я это в какой-то умной книжке читал (Грабер Понимание SQL)). Этот пример меня вообще поверг в шок, я теперь не знаю, как можно вообще нормально писать запросы. Я еще понимаю, что бывают там всякие ленивые вычисления, но блин, это даже не ленивые, а какие-то антиленивые - мегаэнергичные вычисления. Код вьюхи могу привести, но я не уверен, что ошибка воспроизведется нормально - просто не было времени не это (да и сейчас нет - некогда думать, надо код писать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 20:40 |
|
||
|
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
|
|||
|---|---|---|---|
|
#18+
Sonic86, сотню раз обсуждалось уже, вот из последнего: http://www.sql.ru/forum/1142585/mnogokratnyy-vyzov-funkcii ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 21:28 |
|
||
|
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
|
|||
|---|---|---|---|
|
#18+
Sonic86некогда думать, надо код писать offtop Как вы думаете, ох... вам некогда... но найдите пару секунд... Как много желающих, даже при гипотетической интересности вопроса, вам найдётся ответить после сей сентенции? PS It smell as troll... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 21:41 |
|
||
|
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
|
|||
|---|---|---|---|
|
#18+
xtenderSonic86, сотню раз обсуждалось уже, вот из последнего: http://www.sql.ru/forum/1142585/mnogokratnyy-vyzov-funkcii Благодарю! Попробую понять! Я даже не надеялся, что тут есть какая-то логика, думал, что опять невоспроизводимые глюки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 21:19 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39320592&tid=1887312]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
173ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 447ms |

| 0 / 0 |
