Вопрос по exists ... :)

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

Ответить
Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Вопрос по exists ... :)

Сообщение Antoxa » 12 май 2009, 16:54

Как можно оптимизировать следующий запрос?

select Table1
WHERE (DateDoc=:D) and (not exists (select * from Table2 where Table1.ID = Table1.ID))

Дело в том, что в Table1 много записей и запрос выполняется очень долго, но нужна выборка только за одну дату, а как это указать???

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Вопрос по exists ... :)

Сообщение Antoxa » 12 май 2009, 17:11

В чистом виде:

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

select Table1
WHERE (DateDoc=:D) and (not exists (select * from Table2 where Table1.ID = Table1.ID))
он работает быстро,

но так:

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

select Table1.*, Table2.*, Table3.*
from disp
   inner join spr_driver on (disp.id_d= Table2.id_d)
   inner join sprauto on (disp.id_a = Table3.id_a)
WHERE (disp.DATE_GO=:DG) and (not exists (select * from Table4 where Table4.ID = Table1.ID))
работает очень медленно,

хотя, так:

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

select Table1.*, Table2.*, Table3.*
from disp
   inner join spr_driver on (disp.id_d= Table2.id_d)
   inner join sprauto on (disp.id_a = Table3.id_a)
WHERE (disp.DATE_GO=:DG) 
работает быстро...

Видимо придется использовать

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

select Table1
WHERE (DateDoc=:D) and (not exists (select * from Table2 where Table1.ID = Table1.ID))
, а вместо inner join просто воспользоваться lookup полями...

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Вопрос по exists ... :)

Сообщение Antoxa » 12 май 2009, 17:25

Даже в чистом виде:

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

select Table1
WHERE (DateDoc=:D) and (not exists (select * from Table2 where Table1.ID = Table1.ID))
Ч-з IBX выполняется около 2 сек, в таблице Table1 200 записей, в Table2 19000 записей.

В диапазоне Table1.DateDoc=:D только 70 записей, как же получить обработку в Exists только этих 70 записей, чтобы не перебирались все 19000 записей???

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Вопрос по exists ... :)

Сообщение Antoxa » 12 май 2009, 17:34

Вопрос закрыт... :idea:
Просто параметр был равен null...
после задания значения параметра в 12.04.2009 все заработало быстро в любых вариантах!!!

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Re: Вопрос по exists ... :)

Сообщение Tonal » 13 май 2009, 07:31

Antoxa писал(а): select Table1
WHERE (DateDoc=:D) and (not exists (select * from Table2 where Table1.ID = Table1.ID))
А ничё, что выделенное выражение всегда истина?
Или это ошибка при вставке кода сюда?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Вопрос по exists ... :)

Сообщение WildSery » 13 май 2009, 11:12

Антоха, учись читать планы. Или по крайней мере копи-пастить сюда.
Монологи о том, как тяжело работают запросы на каком-то неизвестном сервере с неизвестными планами и индексами утомляют.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Вопрос по exists ... :)

Сообщение Antoxa » 14 май 2009, 18:19

WildSery писал(а):Монологи о том, как тяжело работают запросы на каком-то неизвестном сервере с неизвестными планами и индексами утомляют.
Ок.
Просто никогда не пользовался exists и ОЧЕНЬ обрадовался, когда всё заработало!!! :D

Ответить