powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
4 сообщений из 4, страница 1 из 1
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
    #39320578
Sonic86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
Я - быдлокодер, пишу SQL-запросы в Oracle.

Недавно обнаружил следующую мозгоразрывающую ситуацию:
У меня есть некая несложная вьюха T_VIEW с плоским запросом и был запрос:
Код: plsql
1.
select * from T_VIEW where PARAM = :PARAM


который работал за 1 сек, причем возвращал 2 строки.
Вьюха содержит вызов некой PL/SQL-функции
Код: plsql
1.
fCnt(ID) as CNT.


(CNT здесь всегда некое целое неотрицательное число)
Я добавил ограничение CNT > 0:
Код: plsql
1.
select * from T_VIEW where PARAM = :PARAM and CNT > 0


в результате запрос стал работать 8 секунд! Время отработки было довольно стабильным и не хотело убиваться никакими попытками выпрыгнуть обратно в зону здравого смысла. 8 сек отрабатывали запросы:
Код: plsql
1.
2.
3.
select * from (
select * from T_VIEW where PARAM = :PARAM)
where CNT > 0


Код: plsql
1.
2.
3.
select * from (
select * from T_VIEW where PARAM = :PARAM)
where not CNT = 0


Код: plsql
1.
2.
3.
4.
select * from (
(select * from T_VIEW where PARAM = :PARAM) g,
(select 123 as CNT from LEFT_TABLE where rownum = 1) fict
where g.CNT - 123 + fict.CNT> 0


и еще некоторые, в том числе использовалась замена вьюхи на ее код, внос предикатов внутрь и т.п. - ничего не помогало!
Наконец я вставил в вызов fCnt счетчик, считающий число ее вызовов, и обнаружил, что функция была вызвана примерно 10^5 раз (откуда взялось конкретное число - не посмотрел). Когда дописал к функции слово deterministic (что неправда), тогда число вызовов упало до 2 и результат обнаружился.
Пробовал дописывать всякие костыли типа /*+no_parallel*/, /*+choose*/ - эффекта нуль.
В итоге я вместо этого написал еще одну функцию на PL/SQL, которая обращалась ко вьюхе через курсор, а условие CNT > 0 вынес в PL/SQL, где оно наконец-то отработало естественным образом.

И вот наконец-то вопрос: что это вообще было?! Есть ли вообще хоть какое-то теоретическое объяснение? Меня оно для начала удовлетворило бы вполне. Я всегда думал, что у запросов сначала отрабатывает секция where, потом select (я это в какой-то умной книжке читал (Грабер Понимание SQL)). Этот пример меня вообще поверг в шок, я теперь не знаю, как можно вообще нормально писать запросы. Я еще понимаю, что бывают там всякие ленивые вычисления, но блин, это даже не ленивые, а какие-то антиленивые - мегаэнергичные вычисления.

Код вьюхи могу привести, но я не уверен, что ошибка воспроизведется нормально - просто не было времени не это (да и сейчас нет - некогда думать, надо код писать).
...
Рейтинг: 0 / 0
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
    #39320592
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Sonic86,

сотню раз обсуждалось уже, вот из последнего: http://www.sql.ru/forum/1142585/mnogokratnyy-vyzov-funkcii
...
Рейтинг: 0 / 0
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
    #39320594
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sonic86некогда думать, надо код писать
offtop
Как вы думаете, ох... вам некогда... но найдите пару секунд...
Как много желающих, даже при гипотетической интересности вопроса, вам найдётся ответить после сей сентенции?

PS
It smell as troll...
...
Рейтинг: 0 / 0
Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
    #39321429
Sonic86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderSonic86,

сотню раз обсуждалось уже, вот из последнего: http://www.sql.ru/forum/1142585/mnogokratnyy-vyzov-funkcii Благодарю! Попробую понять!
Я даже не надеялся, что тут есть какая-то логика, думал, что опять невоспроизводимые глюки...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничение FIELD > 0 сильно увеличивает время работы запроса, почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]