Страница 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: проверь почту

число юстасов множится с угрожающей быстротой
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: проверь почту

число юстасов множится с угрожающей быстротой
Юстас - Алексу
Явка провалена. Связь через запасной вариант.
Re: DB вопрос
Добавлено: 27 май 2008, 10:29
Yury
StS писал(а):Yury писал(а):
попробуй
exists (select id from sometable where id = 1)
О! Спасибо.
на здоровье

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)