Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

Нужен   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
4-37979
DriveSoft
2003-11-09 17:08
2004.01.13
Вставка текста в IE


3-37494
dimm22
2003-12-15 13:17
2004.01.13
Максимальный размер файла IB. Во многих источниках видел, что


1-37786
aser
2003-12-28 11:31
2004.01.13
Большие числа


1-37641
Pa5ha
2003-12-26 23:44
2004.01.13
Кнопарь рядом с границей.


1-37660
ikivio
2003-12-26 10:42
2004.01.13
Чтение части файла.