Страница 1 из 3

DB вопрос

Добавлено: 27 май 2008, 09:45
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, но хотелось бы стандартное решение.

Спасибо

Re: DB вопрос

Добавлено: 27 май 2008, 09:51
Yury
SELECT COUNT(*) FROM sometable WHERE id=1

если id индексирован, то работать должно быстро

Re: DB вопрос

Добавлено: 27 май 2008, 09:51
CdR
StS писал(а): select count(*) from
(
SELECT * from sometable
WHERE id=1
limit 1
)
не работает. Как правильно?
select count(*) from sometable where id=1;
не пойдёт?

Re: DB вопрос

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

Re: DB вопрос

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

Re: DB вопрос

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

ps: Юрий уже объяснил...

Re: DB вопрос

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

Записей много, в том числе с id=1

Re: DB вопрос

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

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

попробуй
exists (select id from sometable where id = 1)

Re: DB вопрос

Добавлено: 27 май 2008, 10:14
(Alex)
StS: проверь почту

Re: DB вопрос

Добавлено: 27 май 2008, 10:16
Yury
(Alex) писал(а):StS: проверь почту
:off: число юстасов множится с угрожающей быстротой

Re: DB вопрос

Добавлено: 27 май 2008, 10:25
StS
Yury писал(а): в таком варианте считать все не будет, только с id=1

попробуй
exists (select id from sometable where id = 1)
О! Спасибо.
select 1 where exists
(
SELECT * from transaction
WHERE Id=1
limit 1
)

Re: DB вопрос

Добавлено: 27 май 2008, 10:28
StS
Yury писал(а):
(Alex) писал(а):StS: проверь почту
:off: число юстасов множится с угрожающей быстротой
Юстас - Алексу
Явка провалена. Связь через запасной вариант.

Re: DB вопрос

Добавлено: 27 май 2008, 10:29
Yury
StS писал(а):
Yury писал(а): попробуй
exists (select id from sometable where id = 1)
О! Спасибо.
на здоровье :D

Re: DB вопрос

Добавлено: 27 май 2008, 10:51
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

(эх, давно не брал я в руки сиквел :))

Re: DB вопрос

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