Форум: "Базы";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
ВнизНужен Найти похожие ветки
← →
Andrey V. (2003-12-15 14:41) [0]В смысле быстродействия. Надо росто узнать , есть такое-то значение в таблице или нет (поле не уникальное).
Пока делаю , count(Id) с соответствующими условиями.
← →
_юзер_ (2003-12-15 14:54) [1]зачем count?
можно просто select id from table where id=:id
если поле id проиндексировано, то запрос выполнится быстро
← →
Andrey V. (2003-12-15 15:08) [2]Оно проиндексировано , но не уникально , мне вывалится N строк с моим значением id (id - это я к примеру) , значит для этого серверу надо перебрать ВСЕ зсписи соответствующие условию, а мне достаточно одного , то есть знать , есть ли хоть одно.
Впрочем, может я не там экономлю ...
← →
JibSkeart (2003-12-15 15:10) [3]делай кластерный индекс
← →
Кщд (2003-12-15 15:14) [4]в IB6.x кажется нет first? а жаль.
JibSkeart © (15.12.03 15:10) [3]
если можно, поподробнее про кластерные индексы в IB?
← →
_юзер_ (2003-12-15 15:15) [5]если есть индекс, то вообще-то и count(...) отработает быстро
попробуй выполнить оба запроса и посмотри, что быстрее.
← →
JibSkeart (2003-12-15 15:15) [6]А у вас же ИБ ,нет там я про них не знаю,
даже есть ли такие или нет :)
← →
Sandman25 (2003-12-15 15:18) [7]select count(*) from anytable where exists (select * from table where ...)
← →
Иван Шихалев (2003-12-15 15:22) [8]anytable -> rdb$database ;)
← →
Andrey V. (2003-12-15 15:24) [9]Я делал в IbExpert, он показывает статистику. В общем и count, и
select id from table where id=:id показывают одно и то же.
Но, теоретически , мне казалось , можно извернуться с меньшими затратами.
← →
Кщд (2003-12-15 15:30) [10]Andrey V. © (15.12.03 15:24) [9]
а что, если в ХП сделать и выходить на первой найденной?
← →
Sandman25 (2003-12-15 16:18) [11][8] Иван Шихалев © (15.12.03 15:22)
Наверное :) Я только идею дал, с IB не работаю.
← →
kaif (2003-12-15 16:55) [12]Оптимизатор ускоряет запросы с применением 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...
← →
kaif (2003-12-15 16:56) [13]Пардон, под IF нужно условие в скобках писать:
IF (EXISTS(SELECT ID FROM ... WHERE ...)) THEN
← →
Silver Alex (2003-12-15 17:14) [14]кажеться в IB есть оператор Singular , работает как EXISTS но ему достаточно только первое найденное значение, т.е. остальные не отрабатываются (по крайней мере так писалось в книге).Можно проверить
← →
Sergey_Masloff (2003-12-15 22:10) [15]kaif © (15.12.03 16:55) [12]
ХП тут на фиг не нужна.
select count(*) from rdb$database where exists(select null from yourtable where yourfield = "FLD_VALUE") - самый быстрый способ если поле с индексом. Если нет то IB сделает полное сканирование таблицы.
← →
kaif (2003-12-16 00:26) [16]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-16 06:50) [17]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 anytable where exists (select * from table where ...)
с поправкой от Иван Шихалев © [8] остается одно маленькое но-
select count(*) from rdb$database where exists (select * from table where ...)
приведет к дерганью запроса к системной таблице чтобы узнать что там за звездочкой лежит.
поэтому мой вариант select NULL является самым легковесным
← →
Sandman25 (2003-12-16 10:19) [18][17] Sergey_Masloff (16.12.03 06:50)
Не знаю, как в IB, но в большинстве СУБД количество записей в таблице хранится в поле системной таблицы. Full_scan не понадобится. Если же в IB понадобится, то всегда можно найти (сделать в случае необходимости) таблицу с одной записью.
← →
kaif (2003-12-16 14:14) [19]2 Sergey_Masloff (16.12.03 06:50) [17]
Об обращении к системным таблицам для разрешения звездочки я не подумал. Сдаюсь.
← →
Sandman25 (2003-12-16 15:37) [20]Я тут поковырялся в 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.
← →
Sergey_Masloff (2003-12-16 22:58) [21]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-17 10:15) [22][21] Sergey_Masloff (16.12.03 22:58)
У автора как раз IB, так что Вы оказались полностью правы.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c