медленно работает запрос на выборку

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

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

Ответить
yk
Сообщения: 26
Зарегистрирован: 31 янв 2005, 11:37

медленно работает запрос на выборку

Сообщение yk » 14 апр 2005, 13:22

Уважаемые Мастера!
Помогите пожалуйста с запросом (очень медленно работает и выдаёт не то что надо).

Что у меня есть:
Есть таблицы:
1. таблица сборок

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

   SBORKI (
   IDSBORKA         INTEGER NOT NULL ,
   OBOZNACH         VARCHAR(50) NOT NULL ,
   NAIMENOVAN       VARCHAR(50) NOT NULL ,
   REV              VARCHAR(20) ,
   ISPOLN           VARCHAR(20) ,
   IDSBORKASTATUS   INTEGER NOT NULL ,
   IDEDIZM          INTEGER NOT NULL ,
   IDPROIZVODITEL   INTEGER NOT NULL ,
   PRIMECH          VARCHAR(50) ,
   IDPRIMLEVEL      INTEGER NOT NULL
   );
Индекс (OBOZNACH,NAIMENOVAN,REV,ISPOLN,IDSBORKASTATUS)
2. таблица связей между сборками (сборки могут включать друг друга. типа как вложенные папки)

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

 IERHLINK (
   IDIERHLINK       INTEGER NOT NULL ,
   IDSBORKAPARENT   INTEGER NOT NULL ,
   IDSBORKACHILD    INTEGER NOT NULL ,
   COUNTS           INTEGER NOT NULL ,
   POS              VARCHAR(20) NOT NULL 
    );
Индекс (IDSBORKAPARENT,IDSBORKACHILD,POS)
3. Представление QSborki

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

VIEW QSBORKI(
   IDSBORKA,
   OBOZNACH,
   NAIMENOVAN,
   REV,
   ISPOLN,
   IDSBORKASTATUS,
   SBORKASTATUSNAIMENOVAN,
   IDEDIZM,
   EDIZMNAIMENOVAN,
   IDPROIZVODITEL,
   PROIZVODITELNAIMENOVAN,
   PRIMECH,
   IDPRIMLEVEL,
   PRIMLEVELNAIMENOVAN)
AS
SELECT Sborki.IdSborka,
      Sborki.Oboznach,
      Sborki.Naimenovan,
      Sborki.Rev,
      Sborki.Ispoln,
      Sborki.IdSborkaStatus,
      SborkaStatus.Naimenovan,
      sborki.idedizm,
      EdIzm.naimenovan,//из справочной таблицы
      sborki.idproizvoditel,//из справочной таблицы
      proizvoditel.naimenovan,//из справочной таблицы
      Sborki.Primech,
      Sborki.idprimlevel,
      PrimLevel.naimenovan //из справочной таблицы
FROM Sborki, SborkaStatus, EdIzm,proizvoditel,PrimLevel
WHERE SborkaStatus.IdSborkaStatus=Sborki.IdSborkaStatus and
 EdIzm.idedizm=sborki.idedizm and
 Proizvoditel.idproizvoditel=sborki.idproizvoditel and
 PrimLevel.idprimlevel=sborki.idprimlevel
 ;
В таблице Sborki 580 записей, в ierhlink 4500
В справочных таблицах примерно 10-20 записей
QSborki естественно 580.

Есть запрос

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

SELECT IdSborka, Oboznach, Naimenovan, Rev, Ispoln,  SborkaStatusNaimenovan, Primech
FROM QSborki
WHERE 
idSborkaStatus=4 and 
not(exists (Select * from IerhLink where IerhLink.IdSborkaChild=QSborki.IdSborka))
Order by QSborki.Naimenovan
Требуется: Выбрать все сборки, которые не входят в другие сборки.

В результате:
Запрос работает долго - секунд 20, записи выбираются не все

ПОМОГИТЕ ПОЖАЛУЙСТА!

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Re: медленно работает запрос на выборку

Сообщение sag » 14 апр 2005, 14:25

yk писал(а):Уважаемые Мастера!
Помогите пожалуйста с запросом (очень медленно работает и выдаёт не то что надо).
похоже, никто не отвечает, по причине того, что ответ может быть истолкован как причисление себя к Мастерам :)))
Попробую сделать ход конем, не отвечая на твои вопросы прямо, а задавая наводящие :)))

Для начала надо добиться от запроса правильного результата. Чую, что собака порылась в следующем: "Выбрать все сборки, которые не входят в другие сборки." А что это значит применительно к твоей схеме? То, что для "сборки" нет записи в IerhLink, где IdSborkaChild=:IdSborka? Если это абсолютно да, то другой вопрос: не теряются ли какие записи о интересующих тебя сборках в запросе SELECT * FROM QSborki (это намек, что у тебя во view все связи обязательные, а так ли это в таблицах?).
Если ты все же условием IdSborkaChild=:IdSborka отражаешь суть желаемого не полностью, то надо конкретизировать.

Теперь по куску твоего запроса
exists
(Select *
from IerhLink
where IerhLink.IdSborkaChild=QSborki.IdSborka)

Еще вот думаю, подзапрос не идет по индексу (IDSBORKAPARENT,IDSBORKACHILD,POS), а натуралом (так?), конечно если ты привел полную информацию об индексах.
Попробуй создать индекс только по IDSBORKACHILD. А вообще к оптимизации имеет смысл прикасаться только после выправления самого запроса.

Ответить