Оптимизация select count где select count >X

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Wontar
Сообщения: 21
Зарегистрирован: 08 фев 2006, 16:53

Оптимизация select count где select count >X

Сообщение Wontar » 18 мар 2006, 10:58

Привет всем.

Сижу мучаюсь. Есть запрос типа:

Код: Выделить всё

select * from orders X
where (select count(id) from packets Z where X.ID = Z.Ordercode) > X
Этот запрос при налияии в таблице 240к записей выполняется вечно.
Что можете посоветовать сделать чтобы было быстрее?

Спасибо,
Олег.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Оптимизация select count где select count >X

Сообщение Merlin » 18 мар 2006, 13:04

Wontar писал(а): Сижу мучаюсь.
Нууу... эт, канэшна, дело вкуса. Можно помучитцо, а можно какую-нить книжку вумную почитать про SQL. Граббера того же.
Wontar писал(а): Есть запрос типа:

Код: Выделить всё

select * from orders X
where (select count(id) from packets Z where X.ID = Z.Ordercode) > X
Звёздочка - это принципиально? Или таки достаточно некоторого вменяемого набора полей? Тогда что-нить вроде:

Код: Выделить всё

Select X.ID, X.Col1, X.Col2, X.Col3, Count(*)
From Orders X
 Join Packets Z
  On Z.OrderCode=X.ID
Group By X.ID, X.Col1, X.Col2, X.Col3
Having Count(*)>:X
Wontar писал(а): Этот запрос при налияии в таблице 240к записей выполняется вечно.
Ужос.

Wontar
Сообщения: 21
Зарегистрирован: 08 фев 2006, 16:53

Сообщение Wontar » 18 мар 2006, 22:31

Можно помучитцо, а можно какую-нить книжку вумную почитать про SQL. Граббера того же.
Как раз его и читаю :D Вот совпадение.
Спасибки.

Wontar
Сообщения: 21
Зарегистрирован: 08 фев 2006, 16:53

Сообщение Wontar » 20 мар 2006, 09:52

Тогда что-нить вроде:

Код: Выделить всё

Select X.ID, X.Col1, X.Col2, X.Col3, Count(*) 
From Orders X 
 Join Packets Z 
  On Z.OrderCode=X.ID 
Group By X.ID, X.Col1, X.Col2, X.Col3 
Having Count(*)>:X
Если можно, объясните, как выполняется этот запрос и что нужно делать если нужно отфильтровать Packets по CreationDateTime и узнать какие заказы не содержат пакетов созданных в период времени. (т.е. count(*) = 0)

Сенкс,
Олег.

Ответить