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

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

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

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

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

Добрый день!

Как можно в процедуру передать диапазон допустимых значений для запроса. Например (1, 2, 5, 9) в переменную q
Код: Выделить всё
select *
  from ttask t
where t.state_id in (:q)
Matveih1
 
Сообщения: 24
Зарегистрирован: 11 дек 2007, 15:50

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

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

Присоединяюсь к вопросу... 8)
Antoxa
 
Сообщения: 151
Зарегистрирован: 06 июл 2006, 10:53
Откуда: Russia


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

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

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

p.s. если кто не понял, это предупреждение.
kdv
Forum Admin
 
Сообщения: 6035
Зарегистрирован: 25 окт 2004, 18:07

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

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

Привет,
Можно через параметр varchar передать список, тоесть '1,2,3,4' а потом в процедуре юзать execute statement.
Но сначало подумай хорошо если вообще это тебе надо.
marcodor
 
Сообщения: 9
Зарегистрирован: 10 мар 2010, 00:49

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

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

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

и не надо поднимать топики, которые уже как минимум месяц никто не трогает :)
kdv
Forum Admin
 
Сообщения: 6035
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение marcodor » 10 мар 2010, 19: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


и не надо поднимать ...

Извини ;) скочил сюда с моей проблемы, увидел это и хотел помочь человеку.
marcodor
 
Сообщения: 9
Зарегистрирован: 10 мар 2010, 00:49

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

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

и зачем тут execute statement???

хотел помочь человеку

ну конечно - пусть человек даже когда не надо пихает ES? :)
kdv
Forum Admin
 
Сообщения: 6035
Зарегистрирован: 25 окт 2004, 18:07

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

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

и зачем тут execute statement???

Ну а как по другому впихнуть быстро список значений в where in (??) ? Есть варианты, но так быстро и удобно.
marcodor
 
Сообщения: 9
Зарегистрирован: 10 мар 2010, 00:49

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

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

Ну а как по другому впихнуть быстро список значений в where in

я же давал ссылку:
http://www.ibase.ru/ibfaq.htm#inparam

Мой пример тоже можно оформить в процедуре, но без ES, который в твоем случае по сути ES не является.
kdv
Forum Admin
 
Сообщения: 6035
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение marcodor » 12 мар 2010, 12: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 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
marcodor
 
Сообщения: 9
Зарегистрирован: 10 мар 2010, 00:49

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

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

Осталось только понять зачем пользователь лезет к таблице через ХП и ES когда и так имеет к ней доступ, обычным запросом.
Dimitry Sibiryakov
Заслуженный разработчик
 
Сообщения: 1207
Зарегистрирован: 15 сен 2005, 09:05
Откуда: Krupka


Вернуться в Общие проблемы



Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 2