Как передать диапазон допустимых значений

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Matveih1
Сообщения: 41
Зарегистрирован: 11 дек 2007, 14:50

Как передать диапазон допустимых значений

Сообщение Matveih1 » 06 дек 2009, 19:35

Добрый день!

Как можно в процедуру передать диапазон допустимых значений для запроса. Например (1, 2, 5, 9) в переменную q

Код: Выделить всё

select *
  from ttask t
 where t.state_id in (:q)

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Как передать диапазон допустимых значений

Сообщение Antoxa » 07 дек 2009, 04:03

Присоединяюсь к вопросу... 8)


kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как передать диапазон допустимых значений

Сообщение kdv » 07 дек 2009, 15:56

в первую очередь надо читать FAQ
www.ibase.ru/ibfaq.htm#inparam
и пользоваться поиском. А потом уже спрашивать здесь.

p.s. если кто не понял, это предупреждение.

marcodor
Сообщения: 9
Зарегистрирован: 09 мар 2010, 23:49

Re: Как передать диапазон допустимых значений

Сообщение marcodor » 10 мар 2010, 13:20

Привет,
Можно через параметр varchar передать список, тоесть '1,2,3,4' а потом в процедуре юзать execute statement.
Но сначало подумай хорошо если вообще это тебе надо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как передать диапазон допустимых значений

Сообщение kdv » 10 мар 2010, 18:05

marcodor - хоть с es, хоть без, в таком случае потребуется разобрать входную строку. Причем ES тут не уперся. Например:
http://sql.ru/forum/actualthread.aspx?b ... ws#6686267

и не надо поднимать топики, которые уже как минимум месяц никто не трогает :)

marcodor
Сообщения: 9
Зарегистрирован: 09 мар 2010, 23:49

Re: Как передать диапазон допустимых значений

Сообщение marcodor » 10 мар 2010, 18:51

Привет!

Да зачем разбирать? Можно и так:

Код: Выделить всё

create procedure NEW_PROCEDURE (
    WHEREIN varchar(100))
returns (
    RESULT integer)
as
begin
  execute statement
    'select 1 from RDB$DATABASE where 1 in ('|| WHEREIN ||')'
  into :RESULT;
  suspend;
end
и не надо поднимать ...
Извини ;) скочил сюда с моей проблемы, увидел это и хотел помочь человеку.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как передать диапазон допустимых значений

Сообщение kdv » 11 мар 2010, 12:22

и зачем тут execute statement???
хотел помочь человеку
ну конечно - пусть человек даже когда не надо пихает ES? :)

marcodor
Сообщения: 9
Зарегистрирован: 09 мар 2010, 23:49

Re: Как передать диапазон допустимых значений

Сообщение marcodor » 11 мар 2010, 13:03

и зачем тут execute statement???
Ну а как по другому впихнуть быстро список значений в where in (??) ? Есть варианты, но так быстро и удобно.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Как передать диапазон допустимых значений

Сообщение kdv » 11 мар 2010, 15:45

Ну а как по другому впихнуть быстро список значений в where in
я же давал ссылку:
http://www.ibase.ru/ibfaq.htm#inparam

Мой пример тоже можно оформить в процедуре, но без ES, который в твоем случае по сути ES не является.

marcodor
Сообщения: 9
Зарегистрирован: 09 мар 2010, 23:49

Re: Как передать диапазон допустимых значений

Сообщение marcodor » 12 мар 2010, 11:42

Мой пример тоже можно оформить в процедуре
Ой, не хочю спорить, но вот делал тесты
Where ?ParamStr Containing '~'||T.ID||'~'
работает в сто раз тормознее чем с ES.
ЕS идет по индексу ~12s на 7млн записей, а containing по натуралу 1m 33s
Так что здесь ЕS cамый смак ;)

1:
Query
------------------------------------------------
select
sum(V.ID)
from TB_REPORT_VALUES V
where V.TEMPL_INDEX_ID in (1128624, 1128144, 1128263, 1128260)

Plan
------------------------------------------------
PLAN (V INDEX (RDB$FOREIGN18, RDB$FOREIGN18, RDB$FOREIGN18, RDB$FOREIGN18))

Adapted Plan
------------------------------------------------
PLAN (V INDEX (FK_INDEX, FK_INDEX, FK_INDEX, FK_INDEX))

Query Time
------------------------------------------------
Prepare : 16,00 ms
Execute : 7 738,00 ms
Avg fetch time: 7 738,00 ms

Memory
------------------------------------------------
Current: 9 501 804
Max : 9 635 096
Buffers: 2 048

Operations
------------------------------------------------
Read : 16 650
Writes : 0
Fetches: 43 066


Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts |
| | Total | reads | reads | | | |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| TB_REPORT_VALUES| 0 | 21511 | 0 | 0 | 0 | 0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+

INDEX RDB$FOREIGN18 ON FIELD (TEMPL_INDEX_ID) ASCENDING STATISTIC: 0.00047415838

2:
Query
------------------------------------------------
select
sum(V.ID)
from TB_REPORT_VALUES V
where '1128624 1128144 1128263 1128260' containing V.TEMPL_INDEX_ID

Plan
------------------------------------------------
PLAN (V NATURAL)

Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 93 928,00 ms
Avg fetch time: 93 928,00 ms

Memory
------------------------------------------------
Current: 9 097 400
Max : 9 635 096
Buffers: 2 048

Operations
------------------------------------------------
Read : 186 792
Writes : 0
Fetches: 15 069 587


Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts |
| | Total | reads | reads | | | |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| TB_REPORT_VALUES| 0 | 0 | 7348099 | 0 | 0 | 0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Как передать диапазон допустимых значений

Сообщение Dimitry Sibiryakov » 12 мар 2010, 13:59

Осталось только понять зачем пользователь лезет к таблице через ХП и ES когда и так имеет к ней доступ, обычным запросом.

Ответить