powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
8 сообщений из 8, страница 1 из 1
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32410232
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая процедурка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CREATE PROCEDURE  "dts8002_GetObjList"  (
     "iAction"  INTEGER,
     "iState"  INTEGER)
RETURNS (
     "ID"  INTEGER,
     "Type"  INTEGER,
     "Owner"  INTEGER,
     "HasSlave"  SMALLINT,
     "Attr"  INTEGER,
     "NA"  SMALLINT,
     "Name"  VARCHAR( 255 ),
     "ObjType"  VARCHAR( 255 ))
AS
DECLARE VARIABLE  "TC"  VARCHAR( 80 );
DECLARE VARIABLE  "ShwActive"  SMALLINT;
DECLARE VARIABLE  "ShwDeleted"  SMALLINT;
BEGIN
  if ( "_and_" (: "iState" , 16 )= 16 ) then  "TC" ='8002%'; else  "TC" ='8002';
  if ( "_and_" (: "iState" , 1 )= 1 ) then  "ShwActive" = 0 ; else  "ShwActive" =null;
  if ( "_and_" (: "iState" , 2 )= 2 ) then  "ShwDeleted" = 1 ; else  "ShwDeleted" =null;
 /*...*/ 
  if ( "iAction" = 1 ) then begin
    for select obj. "ID" , obj. "Type" , obj. "Owner" , obj. "HasSlave" , obj. "Attr" , obj. "NA" 
        from  "kdDBType"  typ
             join  "dtObject"  obj on obj. "Type" =typ. "ID"  and (obj. "NA" =: "ShwActive"  or obj. "NA" =: "ShwDeleted" )
 --        where typ."TypeCode" like case "_and_"(:"iState",16) when 16 then "8002%" else "8002" end
 
        where typ. "TypeCode"  like : "TC" 
 --        PLAN SORT (JOIN (TYP "kdDBType_t" INDEX ("kdDBType_U02"),
 
 --                         OBJ "dtObject_t" INDEX ("dtObject_F02_kdDBType")))
 
        order by obj. "ID" 
        into : "ID" , : "Type" , : "Owner" , : "HasSlave" , : "Attr" , : "NA"  do begin
      suspend;
    end
    exit;
  end
 /*...*/ 
END

Теперь вопросы:
1. Планы для запросов с переменными вообще работают? Или я туплю? :)) Ведь если подставить вместо переменной "TC" строковое значение, то закомментированный план становится валидным, иначе только NATURAL , что мне не очень нравится... :(((
2. В закомментированном условии WHERE не выполняется условие по else :(( Что я неправильно пишу? Или like с case 'ом не арбайтен?

P.S. Блин, пришлось строковые переменные в закомментированном куске процедуры взять в двойные кавычки иначе в предварительном просмотре получается:
-- where typ."TypeCode" like case "_and_"(:"iState",16) when 16 then %af_src_str_2 else %af_src_str_3 end
Адинистрация, можно это поправить?
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32410411
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1. Планы для запросов с переменными вообще работают? Или я туплю? :)) Ведь если подставить вместо переменной "TC" строковое значение, то закомментированный план становится валидным, иначе только NATURAL, что мне не очень нравится... :(((


А немного подумать? LIKE может использовать индекс только в случае, если строка паттерна не начинается с wildcard-символа. Что в случае параметра/переменной неизвестно на этапе препаре. Подставь константу "%a" и увидишь тот же NATURAL.

автор2. В закомментированном условии WHERE не выполняется условие по else :(( Что я неправильно пишу? Или like с case'ом не арбайтен?


Разницу в работе LIKE при CHAR и VARCHAR полях знаем? Пиши так:
Код: plaintext
... else cast('8002' as varchar( 20 )) ...

и все будет мягким и шелковистым.
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32410522
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrА немного подумать? LIKE может использовать индекс только в случае, если строка паттерна не начинается с wildcard-символа. Что в случае параметра/переменной неизвестно на этапе препаре. Подставь константу "%a" и увидишь тот же NATURAL.
Хммм, странно с чего бы это вилдкард мешает использованию индекса в запросе. Тем более я вручную указываю, что нужно юзать именно этот индекс... Хех, ладно, будем думать...
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32411671
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторХммм, странно с чего бы это вилдкард мешает использованию индекса в запросе.

Предложи алгоритм поиска в b-tree строки, заканчивающейся на "а". Или содержащей эту букву внутри (в неизвестной позиции).

авторТем более я вручную указываю, что нужно юзать именно этот индекс...

Если бы сервер с тобой согласился, то у него остался бы выбор между генерацией исключения и выдачей неправильных данных.

авторХех, ладно, будем думать...

Да, обычно это помогает ;-)
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32414782
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал, долго думал... Честно! ;)
dimitrЕсли бы сервер с тобой согласился, то у него остался бы выбор между генерацией исключения и выдачей неправильных данных.
Да ну? А если данные правильные? Т.е. ты хочешь сказать что сервер лучше меня знает какие данные будут в переменных? Я так не думаю.
А теперь по существу, насколько я понял, ты входишь в команду разработчиков FB... Следовательно с твоей подачи можно будет сделать такую фичу как ручное указание планов, вне зависимости от того что думает оптимизатор? Я конечно могу разбить этот запрос в ХП на два с двумя константными строками, которые определяются в самом начале, но это не эстетично и громоздко... Почему бы не разрешить разработчику указывать те планы, которые нужны ему? Пусть даже БД вместе с серваком помрут... На то он и разработчик, и он должен думать головой, что он делает... А надежда на оптимизатор и т.д. не всегда способствует нужной скорости... Может я и не прав, тогда объясни мне тупомордому, где именно. ;)
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32415267
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДа ну? А если данные правильные? Т.е. ты хочешь сказать что сервер лучше меня знает какие данные будут в переменных? Я так не думаю.

А если данные неправильные? Сервер должен выдавать правильный результат при любом плане вне зависимости от входных параметров запроса. Если при каком-то плане это не обеспечивается, этот план быть использован не может. Точка.

авторА теперь по существу, насколько я понял, ты входишь в команду разработчиков FB... Следовательно с твоей подачи можно будет сделать такую фичу как ручное указание планов, вне зависимости от того что думает оптимизатор?

А с чего ты взял, что будет таковая подача? Я не джинн по исполнению желаний.

авторЯ конечно могу разбить этот запрос в ХП на два с двумя константными строками, которые определяются в самом начале, но это не эстетично и громоздко...

А встраивать всякую херню в сервер - это более эстетично и менее громоздко, по-твоему?

авторПочему бы не разрешить разработчику указывать те планы, которые нужны ему? Пусть даже БД вместе с серваком помрут... На то он и разработчик, и он должен думать головой, что он делает...

Опыт показывает, что головы у разработчика приложений нет. Зато есть жопа у разработчика СУБД. У если БД с серваком будут умирать, то в конечном счете пострадает именно эта жопа ;-)
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32415293
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно "Вопросов больше не имею..." (с) Дискотека Авария
...
Рейтинг: 0 / 0
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
    #32415405
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr Опыт показывает, что головы у разработчика приложений нет. Зато есть жопа у разработчика СУБД. У если БД с серваком будут умирать, то в конечном счете пострадает именно эта жопа ;-)



Фраза дня. Можно я ее где нибудь процитирую ? (немного перефразировав и выдав за свою ,
естественно)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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