Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос по 2 таблицам, последовательность записей. Помогите ускорить.  [new]
ИринаВ
Member

Откуда: Москва
Сообщений: 470
Есть таблица Unit, с ней связана таблица UnitRec, "1->много", связь по Unit.ID=UnitRec.UnitID.
Поле UnitRec.RecTime это время созд. записи в UnitRec.
Если поле UnitRec.RecKind in (a1,a2,...an) , то это начало (открытие) посл-ности записей, а если UnitRec.RecKind in (b1,b2,...bn), то конец (закрытие) посл-ности. У каждой Unit много таких посл-стей UnitRec.
Запрос должен вернуть все записи из Unit у к-рых не закрыты посл. записей в UnitRec. Те. есть запись с UnitRec.RecKind in (a1,a2,...an) , но после нее нет записи c UnitRec.RecKind in (b1,b2,...bn). Должно работать из Delphi.
Написала запрос, работает быстрей других вариантов

SELECT * 
FROM Unit 
WHERE Unit.Status IN (...) 
 AND (SELECT TOP 1 RecKind FROM UnitRec 
      WHERE UnitRec.UnitID=Unit.[ID] AND RecKind IN (a1...an,b1...bn)
      ORDER BY RecTime DESC) IN (a1...an)

В UnitRec есть индекс: по UnitID , RecKind , RecTime.
Но теперь надо добавить (в рез-т запроса) время открывающей записи UnitRec.RecTime . Переделала так

SELECT 
  Unit.*,
  UR0.RecTime
FROM Unit INNER JOIN UnitRec AS UR0 ON UnitRec.UnitID=Unit.[ID]
WHERE Unit.Status IN (...) AND RecKind IN (a1...an)
 AND (NOT EXISTS(SELECT * FROM UnitRec AS UR1
                 WHERE UR1.UnitID=Unit.[ID] AND UR1.RecKind IN (b1...bn) AND UR1.RecTime>UR0.RecTime))

Но работает медленней, видно на глаз.
Подскажите плзз: есть ли другой какой то подход ,более быстрый ? Не очень дружу с SQL.
28 дек 11, 18:57    [11841885]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по 2 таблицам, последовательность записей. Помогите ускорить.  [new]
aleks2
Guest
select U.*, X.*
(
	select M.UnitID, M.RecTime, UR.Time
	FROM
	(SELECT UnitID, max(RecTime) RecTime FROM UnitRec GROUP BY UnitID) M
	LEFT OUTER JOIN 
	UnitRec UR
	ON UR.UnitID=M.UnitID AND UR.RecTime= M.RecTime
	WHERE UR.RecKind IN (a1...an)
) X
LEFT OUTER JOIN
Unit U
ON X.UnitID=U.[ID]
WHERE Unit.Status IN (...) 
28 дек 11, 19:41    [11842127]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по 2 таблицам, последовательность записей. Помогите ускорить.  [new]
ИринаВ
Member

Откуда: Москва
Сообщений: 470
Аleks2 , еще не совсем вьехала, но идею поняла. Большое спасибо.
С Новым Годом!
29 дек 11, 12:01    [11844718]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить