Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Предположим, имеется процедура PROC1, которая изменяет данные в таблице. Тогда если выполнить запрос: Код: sql 1. и сделать коммит после выполнения, данные изменятся. Почему оптимизатор делает выборку из процедуры, если условие where заведомо ложно? Ведь сразу понятно, что в выборке не будет строк. Версия сервера Firebird: 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 10:23 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Interloperпроцедура PROC1, которая изменяет данные в таблицеСелективная процедура меняющая данные вполне себе сравнима с "выстрелил себе в ногу" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 10:58 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Interloper, никогда не делай в селективных процедурах изменение данных. По поводу оптимизатора читай http://www.ibase.ru/devinfo/dataaccesspaths.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 10:58 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Interloper, "заведомая ложность" условий не проверяется оптимизатором. И закладываться на оптимизатор при изменении данных нельзя по определению. Сервер сделал ровно то, что его попросили - не вернул ни одной строки. Любые связанные эффекты - проблемы индейцев с точки зрения шерифа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 11:22 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
InterloperПочему оптимизатор делает выборку из процедуры, если условие where заведомо ложно? потому что сначала выполняется процедура, а потом проверяется where. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 11:24 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
kdvInterloperПочему оптимизатор делает выборку из процедуры, если условие where заведомо ложно? потому что сначала выполняется процедура, а потом проверяется where. Мне нужно сделать так, чтобы процедура не выполнялась, если условие ложно. Логичнее сначала проверить where, если его условие не зависит от выборки и ложно, то незачем пытаться выбирать данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:12 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
InterloperМне нужно сделать так, чтобы процедура не выполнялась, если условие ложно. тогда до свидания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:18 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
InterloperМне нужно сделать так, чтобы процедура не выполнялась, если условие ложно. Ну и что тебе мешает проверить условие и НЕ ВЫЗЫВАТЬ процедуру если оно ложно?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:25 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Interloper, зависит от многих факторов. Это не всегда можно сделать. Надо следить за зависимостями есть ли в условиях выходные столбцы процедуры или нет. Пока оптимизатор такого не делает. Есть обходной путь Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:27 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
InterloperМне нужно сделать так, чтобы процедура не выполнялась, если условие ложно. Логичнее сначала проверить where, если его условие не зависит от выборки и ложно, то незачем пытаться выбирать данные. Ну так никто не мешает и IF поставить и не вызывать процедуру зы. и даже если процедура не меняет данные, такой подход может дать ощутимый выигрыш во времени выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:30 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисзависит от многих факторов. Это не всегда можно сделать. Надо следить за зависимостями есть ли в условиях выходные столбцы процедуры или нет. Пока оптимизатор такого не делает. Надеюсь, что и не будет такого делать Ибо не надо писать такой код (Сугубо моё мнение). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:40 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
InterloperМне нужно сделать так, чтобы процедура не выполнялась, если условие ложно.Передай это условие, как входной параметр процедуры и внутри проанализируй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:46 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Interloper, покажи текст процедуры. Чувствую с изменениями данных внутри неё ты нарвёшся на грабли даже когда этого условия нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 12:53 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисникогда не делай в селективных процедурах изменение данных. По поводу оптимизатора читай http://www.ibase.ru/devinfo/dataaccesspaths.htm А можно разъяснить поподробнее или тынцнуть, почему так? Только потому, что, предполагается вызов селекта из ридонли транзакции? Иногда очень удобно создавать некий кэш данных в селективной процедуре. Можно, конечно, его создавать и после вызова процедуры - вызовом другой процедуры, но неудобно/некрасиво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 14:30 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRockА можно разъяснить поподробнее или тынцнуть, почему так? скажем, в обновлении данных в селективных процедурах есть специфика. Об этом написано в http://www.ibase.ru/devinfo/sp_call.htm то есть, если обновление данных стоит в цикле с suspend, то не факт, что такое обновление дойдет до конца. Потому что suspend выполняется при fetch, а пользователь совершенно необязательно считает всю выборку к себе. То есть, до EOF он не дойдет, а значит не все обновления выполнятся. В результате такую процедуру для гарантированного выполнения на всех записях придется обрамлять в запрос типа select count(*) from procedure, что нивелирует suspend. YuRockИногда очень удобно создавать некий кэш данных в селективной процедуре. я не знаю, о чем речь, потому что никакого "кэша" при выборке из процедуры не будет, то есть, после вывода из процедуры все результаты "улетят в пространство". Автор ОБНОВЛЯЕТ ДАННЫЕ в селективной процедуре. Отсюда и проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 14:58 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
kdv, Спасибо, понятно. Про suspend->fetch я знал. Это единственный "подводный камень"? Для "моего" случая это не проблема. Я использую изменения данных в селективной процедуре в след. случае: есть таблица - "КэшОстатковТоваровНаСмену". Процедура проверяет, есть ли на эту "смену" запись, если есть - сразу возвращает значение из этой записи (SUSPEND), если нет - считает остатки товаров (на основе предыдущих записей в "кэше" и других данных), добавляет запись в "КэшОстатковТоваровНаСмену" и делает SUSPEND. В этом случае ничего страшного не произойдет, если не все фетчи "сделаются". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:07 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, потому что есть такой волшебный оператор как SUSPEND почитай как он работает. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В таблице T 1000000 записей. Сколько раз удаление будет сделано? Учти что набор данных может быть недофетчен. И как сказал dimitr никогда не надо делать никаких предположений о работе оптимизатора. JOIN с такой процедурой может дать вообще непредсказуемые результаты. Я вижу только одно исключение в данном случае это вставка во временные таблицы. Но там тоже надо действовать осторожно. Как минимум не делать ничего того что может модифицировать данные в курсоре в котором есть SUSPEND ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:07 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, про SUSPEND есть ещё один прикол. В тройке исправили нестабильный PSQL курсор. Так вот это работает только если в этом курсоре нет SUSPEND. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:10 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисЯ вижу только одно исключение в данном случае это вставка во временные таблицы Спасибо, мой случай другой: 17524639 - мне кажется такое тоже имеет право на жизнь. А изменять важные данные и делать suspend в цикле FOR SELECT у меня ума еще не хватало пока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:14 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, при осторожном использовании в принципе можно. Но проще взять за правило если в процедуре есть модификации и надо вернуть 1 строку, то использовать вызов EXECUTE PROCEDURE без SUSPEND в процедуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:21 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисВ тройке исправили нестабильный PSQL курсор. Спасибо, я такой проблемы старался избегать всегда. А SUSPEND в процедурах, которые что-то меняют, я делаю только в случаях, как вышеописанный. Т.е. никогда не меняя данные курсора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:24 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисНо проще взять за правило если в процедуре есть модификации и надо вернуть 1 строку, то использовать вызов EXECUTE PROCEDURE без SUSPEND в процедуре Ну, понятно, если 1 строку, то лучше без SUSPEND. Но бывает, что надо по списку товаров отчет показать, например. А иногда джойнить удобно - при этом вообще без SUSPEND не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:31 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, в этом случае модификации в процедуре выглядят странно. А если процедура джойнится то в двойне странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:39 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисв этом случае модификации в процедуре выглядят странно Ну, я ж и спрашиваю - почему странно? Единственное, что плохо - read/write транзакция может сравнительно долго висеть, пока отчет открыт (если не все записи профетчились, у меня все фетчатся и сразу коммит). А джойн - используется в случае, когда одну строку возвращает. Например, для проверки параметров товаров перед продажей. Что-то типа Код: sql 1. 2. 3. 4. 5. 6. Можно join, можно подзапрос - тут непринципиально важно - 1 запись будет. А если в GET_REST передать NULL - то будет отчет по всем товарам (остатки). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:50 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Hello, Yurock! You wrote on 16 апреля 2015 г. 15:51:31: Yurock> Ну, я ж и спрашиваю - почему странно? потому, что трусы на голове. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:51 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Мимопроходящийпотому, что трусы на голове. Это последний аргумент? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:55 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, потому что ты не можешь предсказать сколько раз у тебя модификация данных в процедуре произойдёт. 1 раз, 100 или 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 16:42 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Дениспотому что ты не можешь предсказать сколько раз у тебя модификация данных в процедуре произойдёт. 1 раз, 100 или 0. А зачем мне это предсказывать, если мне это вообще не важно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 16:47 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Что странного в том, что я не могу предсказать то, что непредсказуемо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 16:48 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, странно желание что-то модифицировать при выборке. Если нужна модификация запускают отдельный запрос на модификацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 16:55 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисстранно желание что-то модифицировать при выборке Сервер, ОС, ... модифицируют свой кэш "при выборке". Это Вам почему-то не кажется странным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:01 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисстранно желание что-то модифицировать при выборке. Да ладно, materialized view refresh on demand не такая уж и странная вещь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:02 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, дык они же модифицируется не во время того как из них select делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:10 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисдык они же модифицируется не во время того как из них select делается Нет, как раз в это время они и модифицируются. В отличии от refresh on commit собратьев. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:13 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, хм... Я почитал про них. Написано что изменения в этом режиме вносятся по расписанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:19 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисЯ почитал про них. Хммм... Надо тоже пойти почитать. Вдруг Оракул ещё глупее чем я думал?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:48 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
m7mInterloperМне нужно сделать так, чтобы процедура не выполнялась, если условие ложно. Логичнее сначала проверить where, если его условие не зависит от выборки и ложно, то незачем пытаться выбирать данные. Ну так никто не мешает и IF поставить и не вызывать процедуру зы. и даже если процедура не меняет данные, такой подход может дать ощутимый выигрыш во времени выполнения Мешает. Мне нужно составить запрос SELECT, в который подставляется некий параметр в условие WHERE. Сам запрос менять нельзя. Поэтому нужно, чтобы процедура не вызывалась, если параметр = false. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 12:15 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
InterloperМне нужно составить запрос SELECT... Сам запрос менять нельзя EXECUTE BLOCK даст тебе такой "запрос SELECT", в который можно вставить IF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 12:26 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRockInterloperМне нужно составить запрос SELECT... Сам запрос менять нельзя EXECUTE BLOCK даст тебе такой "запрос SELECT", в который можно вставить IF У нас FB 1.5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 12:35 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Interloper, я же тебе дал вариант с LEFT JOIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 12:46 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денися же тебе дал вариант с LEFT JOIN Из "Сам запрос менять нельзя" я понял, что процедуру ему менять нельзя. А с JOIN она всё равно вызовется. InterloperУ нас FB 1.5. Тогда сделай еще одну процедуру, в которую уже передавай параметр, в ней же делай IF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 13:55 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRockСимонов Денися же тебе дал вариант с LEFT JOIN Из "Сам запрос менять нельзя" я понял, что процедуру ему менять нельзя. А с JOIN она всё равно вызовется. не вызовется. Можешь проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 13:59 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
Симонов Денисне вызовется. Можешь проверить. on 1=0 не заметил. Чес. говоря не могу вкурить, как такое можно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 14:02 |
|
||
|
Странное поведение оптимизатора Firebird
|
|||
|---|---|---|---|
|
#18+
YuRock, ну например вот так Код: sql 1. 2. 3. но это верно только для LEFT JOIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 14:15 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1562900]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 261ms |
| total: | 530ms |

| 0 / 0 |
