DB вопрос

Все, что вы хотели знать о программизме, но боялись спросить.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

DB вопрос

Сообщение StS »

Есть таблица с большим количеством записей

CREATE TABLE sometable
(
id INTEGER NOT NULL,
name VARCHAR(30),
куча других полей
);


Нужно быстро определить есть ли в ней записи с id=1
select count(*) from sometable
работает медленно, так как считает всё.

select count(*) from
(
SELECT * from sometable
WHERE id=1
limit 1
)
не работает. Как правильно?
PostgreSQL, но хотелось бы стандартное решение.

Спасибо
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

SELECT COUNT(*) FROM sometable WHERE id=1

если id индексирован, то работать должно быстро
Последний раз редактировалось Yury 27 май 2008, 09:52, всего редактировалось 1 раз.
Аватара пользователя
CdR
Графоман
Сообщения: 11245
Зарегистрирован: 11 окт 2004, 19:27
Откуда: Европа, центр, за углом направо.

Re: DB вопрос

Сообщение CdR »

StS писал(а): select count(*) from
(
SELECT * from sometable
WHERE id=1
limit 1
)
не работает. Как правильно?
select count(*) from sometable where id=1;
не пойдёт?
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Re: DB вопрос

Сообщение StS »

CdR писал(а): select count(*) from sometable where id=1;
не пойдёт?
StS писал(а): select count(*) from sometable
работает медленно, так как считает всё.
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

StS писал(а):
CdR писал(а): select count(*) from sometable where id=1;
не пойдёт?
StS писал(а): select count(*) from sometable
работает медленно, так как считает всё.
where id=1
Аватара пользователя
CdR
Графоман
Сообщения: 11245
Зарегистрирован: 11 окт 2004, 19:27
Откуда: Европа, центр, за углом направо.

Re: DB вопрос

Сообщение CdR »

StS писал(а):
CdR писал(а): select count(*) from sometable where id=1;
не пойдёт?
StS писал(а): select count(*) from sometable
работает медленно, так как считает всё.
И?

ps: Юрий уже объяснил...
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Re: DB вопрос

Сообщение StS »

Виноват, следует читать
select count(*) from sometable where id=1
работает медленно, так как считает всё

Записей много, в том числе с id=1
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

StS писал(а):Виноват, следует читать
select count(*) from sometable where id=1
работает медленно, так как считает всё

Записей много, в том числе с id=1
в таком варианте считать все не будет, только с id=1

попробуй
exists (select id from sometable where id = 1)
(Alex)
Маньяк
Сообщения: 4203
Зарегистрирован: 08 мар 2006, 15:45
Откуда: Ричмонд

Re: DB вопрос

Сообщение (Alex) »

StS: проверь почту
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

(Alex) писал(а):StS: проверь почту
:off: число юстасов множится с угрожающей быстротой
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Re: DB вопрос

Сообщение StS »

Yury писал(а): в таком варианте считать все не будет, только с id=1

попробуй
exists (select id from sometable where id = 1)
О! Спасибо.
select 1 where exists
(
SELECT * from transaction
WHERE Id=1
limit 1
)
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Re: DB вопрос

Сообщение StS »

Yury писал(а):
(Alex) писал(а):StS: проверь почту
:off: число юстасов множится с угрожающей быстротой
Юстас - Алексу
Явка провалена. Связь через запасной вариант.
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

StS писал(а):
Yury писал(а): попробуй
exists (select id from sometable where id = 1)
О! Спасибо.
на здоровье :D
Аватара пользователя
alpax
Графоман
Сообщения: 10548
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Re: DB вопрос

Сообщение alpax »

StS писал(а):О! Спасибо.
select 1 where exists
(
SELECT * from transaction
WHERE Id=1
limit 1
)
А зачем два селекта? По-моему этого будет достаточно:
SELECT 1 from transaction
WHERE Id=1
limit 1

Кстати, а "TOP #" есть только в MS SQL или это более распространенная опция? Насчет синтаксиса правда сомневаюсь - что-то типа такого:
SELECT top 1 1 FROM transaction WHERE Id=1

(эх, давно не брал я в руки сиквел :))
Аватара пользователя
Algor
Маньяк
Сообщения: 1355
Зарегистрирован: 14 мар 2006, 01:38
Откуда: Самара->Ванкувер

Re: DB вопрос

Сообщение Algor »

alpax писал(а): Кстати, а "TOP #" есть только в MS SQL или это более распространенная опция?
В Oracle можно использовать rownum. правда , это не аналог TOP, но в данном случае rownum=1 будет тоже работать, но я бы использовал exists (в первую очередь для переносимости кода между разными DB)
Ответить