Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.009 c
6-37835
Manulo
2003-11-11 14:54
2004.01.13
Socket Error #10049


3-37535
Olga_Oo
2003-12-16 11:41
2004.01.13
String


1-37789
Александр Крючков
2003-12-25 17:56
2004.01.13
Проблемы с отладкой.


3-37566
List
2003-12-12 00:01
2004.01.13
Data Module


14-37935
Bokus
2003-12-20 14:55
2004.01.13
Сети Петри (проверка на дастижимость и живость)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский