Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE / 8 сообщений из 8, страница 1 из 1
16.02.2004, 11:55
    #32410232
Kull Damned
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
Есть такая процедурка:
Код: 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
16.02.2004, 13:33
    #32410411
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два вопроса по Firebird: Плановое хозяйство (PLAN) и CASE
автор1. Планы для запросов с переменными вообще работают? Или я туплю? :)) Ведь если подставить вместо переменной "TC" строковое значение, то закомментированный план становится валидным, иначе только NATURAL, что мне не очень нравится... :(((


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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



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


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