Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужен


Страницы:   1 2

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]

делай кластерный индекс


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо