![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужен
Andrey V. © (2003-12-15 14:41:00)
В смысле быстродействия. Надо росто узнать , есть такое-то значение в таблице или нет (поле не уникальное).
Пока делаю , count(Id) с соответствующими условиями.
Sandman25 (2003-12-17 10:15:00) [1]
[21] Sergey_Masloff (16.12.03 22:58)
У автора как раз IB, так что Вы оказались полностью правы.
Sergey_Masloff (2003-12-16 22:58:00) [2]
Sandman25 © (16.12.03 15:37) [20]
да какие извинения... ;-)
>Exists (select * from table where) выполняется ровно столько >же, сколько и select 1 from table where. Обе выполняются в >режиме Parallel, fragments: ALL.
Ну значит оптимизирует Informix. Я давно не экспериментировал но раньше IB не понимал в таком случае что мне список полей на фиг не нужен.
Sandman25 (2003-12-16 15:37:00) [3]
Я тут поковырялся в Informix... Приношу свои извинения to Sergey_Masloff.
select count(*) from table where exists действительно использует SEQUENTIAL SCAN по table.
Exists (select * from table where) выполняется ровно столько же, сколько и select 1 from table where. Обе выполняются в режиме Parallel, fragments: ALL.
kaif (2003-12-16 14:14:00) [4]
2 Sergey_Masloff (16.12.03 06:50) [17]
Об обращении к системным таблицам для разрешения звездочки я не подумал. Сдаюсь.
Sandman25 (2003-12-16 10:19:00) [5]
[17] Sergey_Masloff (16.12.03 06:50)
Не знаю, как в IB, но в большинстве СУБД количество записей в таблице хранится в поле системной таблицы. Full_scan не понадобится. Если же в IB понадобится, то всегда можно найти (сделать в случае необходимости) таблицу с одной записью.
Sergey_Masloff (2003-12-16 06:50:00) [6]
kaif © (16.12.03 00:26) [16]
>Согласен. О таком решении уже говорили.
>(Sandman25 © (15.12.03 15:18) [7] и
>Иван Шихалев © (15.12.03 15:22) [8])
в примере от Sandman25 © (15.12.03 15:18) [7] будет фуллскан anytable что совсем не облегчит запрос. см.
select count(*) from anytablewhere exists (select * from table where ...)
с поправкой от Иван Шихалев © [8] остается одно маленькое но-
select count(*) from rdb$database where exists (select *from table where ...)
приведет к дерганью запроса к системной таблице чтобы узнать что там за звездочкой лежит.
поэтому мой вариант select NULLявляется самым легковесным
kaif (2003-12-16 00:26:00) [7]
2 Sergey_Masloff (15.12.03 22:10) [15]
Согласен. О таком решении уже говорили.
(Sandman25 © (15.12.03 15:18) [7] и
Иван Шихалев © (15.12.03 15:22) [8])
Я просто привел еще один вариант решения только для того чтобы показать, что возможны конструкции IF (EXISTS(... в текстах ХП.
Sergey_Masloff (2003-12-15 22:10:00) [8]
kaif © (15.12.03 16:55) [12]
ХП тут на фиг не нужна.
select count(*) from rdb$database where exists(select null from yourtable where yourfield = "FLD_VALUE") - самый быстрый способ если поле с индексом. Если нет то IB сделает полное сканирование таблицы.
Silver Alex (2003-12-15 17:14:00) [9]
кажеться в IB есть оператор Singular , работает как EXISTS но ему достаточно только первое найденное значение, т.е. остальные не отрабатываются (по крайней мере так писалось в книге).Можно проверить
kaif (2003-12-15 16:56:00) [10]
Пардон, под IF нужно условие в скобках писать:
IF (EXISTS(SELECT ID FROM ... WHERE ...)) THEN
kaif (2003-12-15 16:55:00) [11]
Оптимизатор ускоряет запросы с применением exists.
Я бы сделал хранимую процедуру с таким текстом:
CREATE PROCEDURE GET_MY_VALUE_EXISTS
RETURNS(MY_VALUE_EXISTS INTEGER)
AS
BEGIN
IF EXISTS(SELECT ID FROM ... WHERE ...) THEN
MY_VALUE_EXISTS = 1
ELSE
MY_VALUE_EXISTS = 0;
SUSPEND;
END
Можно даже с входным параметром MY_VALUE...
Sandman25 (2003-12-15 16:18:00) [12]
[8] Иван Шихалев © (15.12.03 15:22)
Наверное :) Я только идею дал, с IB не работаю.
Кщд (2003-12-15 15:30:00) [13]
Andrey V. © (15.12.03 15:24) [9]
а что, если в ХП сделать и выходить на первой найденной?
Andrey V. (2003-12-15 15:24:00) [14]
Я делал в IbExpert, он показывает статистику. В общем и count, и
select id from table where id=:id показывают одно и то же.
Но, теоретически , мне казалось , можно извернуться с меньшими затратами.
Иван Шихалев (2003-12-15 15:22:00) [15]
anytable -> rdb$database ;)
Sandman25 (2003-12-15 15:18:00) [16]
select count(*) from anytable where exists (select * from table where ...)
JibSkeart (2003-12-15 15:15:00) [17]
А у вас же ИБ ,нет там я про них не знаю,
даже есть ли такие или нет :)
_юзер_ (2003-12-15 15:15:00) [18]
если есть индекс, то вообще-то и count(...) отработает быстро
попробуй выполнить оба запроса и посмотри, что быстрее.
Кщд (2003-12-15 15:14:00) [19]
в IB6.x кажется нет first? а жаль.
JibSkeart © (15.12.03 15:10) [3]
если можно, поподробнее про кластерные индексы в IB?
JibSkeart (2003-12-15 15:10:00) [20]
делай кластерный индекс