powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CORE-3076 ("OR'ed params": field = :param or :param = -1): не работает с view от group by
3 сообщений из 3, страница 1 из 1
CORE-3076 ("OR'ed params": field = :param or :param = -1): не работает с view от group by
    #38623295
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

В узких кругах широко известно, что до FB 2.5 включительно ХП, делающие выборки вида
Код: sql
1.
where some_field = :a_key or :a_key is null

- будут "идти по натуралу", если передан null.
Можно, конечно, делать выкрутасы типа
Код: sql
1.
where some_field between coalesce( :a_key, -99999999 ) and coalesce( :a_key, 99999999)

- но для between оптимизатор считает, что вернётся 25% строк, и это может повлиять на выбор индекса.

В релизнотах к ФБ-3 на странице 57 сказано: OR'ed Parameter in WHERE Clause
Dmitry Yemanov
Performance for (table.field = :param or :param = -1) in the WHERE clause was enhanced.- что относится, видимо, к http://tracker.firebirdsql.org/browse/CORE-3076

Увы и ах, но сиё не работает для выборок из вьюх, если они созданы с group by.

DDL:
Код: 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.
create or alter procedure sp_agg_ored as begin end;
create or alter procedure sp_agg_btwn as begin end;
recreate view v_ts_agg as select 0 x, 0 cnt from rdb$database;
commit;
recreate table ts(id int primary key using index ts_pk, x int);
create index ts_x on ts(x);

recreate view v_ts_agg as select x, count(*) cnt from ts group by x;
commit;

insert into ts select row_number()over(), rand()*100 from rdb$types, rdb$types, (select 1 i from rdb$types rows 5);
commit;

set term ^;
create or alter procedure sp_agg_ored( a_selected_x int ) as
  declare n int;
begin
  select count(*) from v_ts_agg v 
  where  
    -- в релизнотах к ФБ-3.0 обещано, что будет всё равно юзать индекс... 
    v.x =:a_selected_x or :a_selected_x is null 
  into n;
end
^

create or alter procedure sp_agg_btwn( a_selected_x int ) as
  declare n int;
begin
  select count(*) from v_ts_agg v
  where v.x
      -- старый изврат-с... но чаще всего - работает Ok :) 
     between coalesce(:a_selected_x, -999999999 ) and coalesce(:a_selected_x, 999999999 ) 
  into n;
end
^
set term ;^
commit;
(таблица `ts(id, x)` с ~300 тыс строками, вьюха от неё на основе group_by-запроса, и две параметризованные ХП: одна делает выборку по OR'ed-принципу, вторая - по between-"изврату").

Далее выполняю:
Код: plaintext
1.
SQL> execute procedure sp_agg_ored(1);
SQL> execute procedure sp_agg_btwn(1);

И вижу:
trace для sp_agg_ORed(1)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
2014-04-23T15:46:00.7100 (18178:0x7fe179cd9280) EXECUTE_PROCEDURE_FINISH
        /var/db/fb30/oltp30.fdb (ATT_18520, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:2652
                (TRA_19676651, CONCURRENCY | WAIT | READ_WRITE)

Procedure SP_AGG_ORED:
param0 = integer, "1"

    835 ms, 945317 fetch(es)

Table                             Natural     Index    Update    Insert    Delete  
***********************************************************************************
TS                                           315005
== vs ==
trace для sp_agg_BTWN(1)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
2014-04-23T15:46:11.0110 (18178:0x7fe179cd9280) EXECUTE_PROCEDURE_FINISH
        /var/db/fb30/oltp30.fdb (ATT_18520, SYSDBA:NONE, NONE, TCPv4:192.168.43.96
        C:\MIX\firebird\fb25\bin\isql.exe:2652
                (TRA_19676651, CONCURRENCY | WAIT | READ_WRITE)

Procedure SP_AGG_BTWN:
param0 = integer, "1"

     10 ms, 9432 fetch(es)

Table                             Natural     Index    Update    Insert    Delete 
**********************************************************************************
TS                                             3142
...
Рейтинг: 0 / 0
CORE-3076 ("OR'ed params": field = :param or :param = -1): не работает с view от group by
    #38623299
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоиддо FB 2.5 включительно ХП, делающие выборки вида
Код: sql
1.
where some_field = :a_key or :a_key is null


- будут "идти по натуралу", если передан null.Поправочка. Будут идти ВСЕГДА по натуралу, чтобы туда не передавали.
...
Рейтинг: 0 / 0
CORE-3076 ("OR'ed params": field = :param or :param = -1): не работает с view от group by
    #38623310
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

внутрь группировки пропихивается не все, а лишь условия с полями нижележащих таблиц. Поэтому CORE-3076 поверх группировки не работает. Теоретически может такое и возможно, но разбираться нет ни времени ни желания.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CORE-3076 ("OR'ed params": field = :param or :param = -1): не работает с view от group by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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