![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Страшно тормозит запрос к базе IB [D5, D6, D7, IB6.x, Paradox]
KIR © (2003-09-24 18:39:00)
Народ вот есть запрос (я его упростил, чтоб была суть ясна):
SELECT
Table1.ID,
Table1.DataField,
COUNT(Table2.FID) AS CNT
FROM
Table1,Table2
WHERE
Table2.FID = Table1.ID
AND
Table2.FID
NOT IN
(
SELECT
FID
FROM
Table2
WHERE
Table2.DAT > :DAT
GROUP BY
Table2.FID
)
GROUP BY
Table1.ID,
Table1.DataField
HAVING
COUNT(Table2.FID) >= :COUNTPARAM
Так вот этот запрос выполняется больше 4 мин... хотя Paradox выполняет этот же запрос за несколько секунду!
Я вроде понимаю, чтоNOT IN (SELECT..)нужно заменить наNOT EXISTSтолько вот не ссображу как...
Sandman25 (2003-09-25 10:06:00) [1]
[4] KIR © (24.09.03 18:59)
Да, я теперь вспомнил, что стандартный способ замены IN на EXISTS состоит в перетаскивании условия из IN во вложенного SELECT.
Поэтому вариант [3] теоретически эквивалентен исходному. Ну разве что еще можно вместо SELECT fid заменить на SELECT *.
ЮЮ (2003-09-25 02:43:00) [2]
Условие ON в операторе JOIN позволяеет не только связывать записи двух таблиц, но и фильтровать записи присоединяемой таблицы:
SELECT
Table1.ID, Table1.DataField, COUNT(Table2.FID) AS CNT
FROM
Table1
LEFT JOIN Table2 ON
(Table1.ID = Table2.FID ) AND (Table2.DAT <= :DAT)
GROUP BY Table1.ID, Table1.DataField
HAVING
COUNT(Table2.FID) >= :COUNTPARAM
KIR (2003-09-24 18:59:00) [3]
Да вроде угадал... только теперь запрос ваще ничего не возвращает, но это скорее всего я уже что-то намудрил...
Sandman25 (2003-09-24 18:51:00) [4]
AND NOT EXISTS(
SELECT
FID
FROM
Table2 t3
WHERE
t3.fid = table2.fid
t3.DAT > :DAT
)
Хоть теперь угадал? :)
Sandman25 (2003-09-24 18:49:00) [5]
Упс, неправильно понял.
SELECT
Table1.ID,
Table1.DataField,
COUNT(Table2.FID) AS CNT
FROM
Table1,Table2
WHERE
Table2.FID = Table1.ID
AND
Table2.FID <= :DAT
GROUP BY
Table1.ID,
Table1.DataField
HAVING
COUNT(Table2.FID) >= :COUNTPARAM
Sandman25 (2003-09-24 18:46:00) [6]
AND NOT EXISTS(
SELECT
FID
FROM
Table2 t3
WHERE
t3.DAT > :DAT
)
Но честно говоря, большого смысла я в подзапросе не вижу - он же не зависит от внешнего select.
Возможно, надо так
AND NOT EXISTS(
SELECT
FID
FROM
Table2 t3
WHERE
t3.fid = table1.id
t3.DAT > :DAT
)