Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38938419&tid=1562900]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 281ms |

| 0 / 0 |
