Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

Страшно тормозит запрос к базе IB   Найти похожие ветки 

 
KIR ©   (2003-09-24 18:39) [0]

Народ вот есть запрос (я его упростил, чтоб была суть ясна):

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-24 18:46) [1]

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
)


 
Sandman25 ©   (2003-09-24 18:49) [2]

Упс, неправильно понял.

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:51) [3]

AND NOT EXISTS(
SELECT
FID
FROM
Table2 t3
WHERE
t3.fid = table2.fid
t3.DAT > :DAT
)

Хоть теперь угадал? :)


 
KIR ©   (2003-09-24 18:59) [4]

Да вроде угадал... только теперь запрос ваще ничего не возвращает, но это скорее всего я уже что-то намудрил...


 
ЮЮ ©   (2003-09-25 02:43) [5]

Условие 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


 
Sandman25 ©   (2003-09-25 10:06) [6]

[4] KIR © (24.09.03 18:59)

Да, я теперь вспомнил, что стандартный способ замены IN на EXISTS состоит в перетаскивании условия из IN во вложенного SELECT.
Поэтому вариант [3] теоретически эквивалентен исходному. Ну разве что еще можно вместо SELECT fid заменить на SELECT *.



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
1-51197
Alek Silverstone
2003-10-02 14:37
2003.10.16
CLX + цвет + TMemo


3-51092
Алекси
2003-09-26 18:31
2003.10.16
перевод цифр в их словарные значения


1-51224
@Ujin
2003-10-03 18:20
2003.10.16
Интерфейс для TForm


3-51119
Goga
2003-09-25 10:29
2003.10.16
Проблема со вставкой записи.


14-51485
JOY
2003-09-28 06:09
2003.10.16
И еще есть вопросик. Звучит от так: