Re: Помогите оптимизировать...
От: VVP Россия 67524421
Дата: 05.01.03 18:14
Оценка:
Здравствуйте, ChainSmoker, Вы писали:
CS>базовая таблица: t1 (~15000 записей)
CS>LONG id1 (index)
CS>LONG id2 (index)

CS>базовая таблица: t2 (~10000 записей)
CS>LONG id2 (uniq index)
CS>DATETIME date (index)

CS>промежуточный запрос: q1
CS>SELECT t1.id1, t1.id2, t2.date
CS>FROM t1 INNER JOIN t2 ON t1.id2 = t2.id2;

CS>результирующий запрос: q2
CS>PARAMETERS prmDate As DATETIME;
CS>SELECT a1.id1, a1.id2
CS>FROM q1 AS a1
CS>WHERE a1.date = (SELECT Max(a2.date)
CS>        FROM q1 AS a2
CS>        WHERE a2.id1 = a1.id1 AND a2.date <= prmDate);

-- маленькая рекомендация, писать внутренний джойн так:
SELECT T1.ID1, T1.ID2, T2.DATE
FROM T1, T2 WHERE T1.ID2=T2.ID2;
-- ну это лирическое отступление.

-- теперь о птицах, параметр - &D1
SELECT T1.ID1, T1.ID2, MAX(T2.DATE) AS MAX_DATE
FROM T1, T2
WHERE T1.ID2=T2.ID2 AND T2.DATE<&D1
GROUP BY T1.ID1, T1.ID2

На оракле работает в 4-5 раз быстрее твоего запроса на выборке:
T1 — 400000 записей, T2 — 60000 записей, результирующий набор возвращает порядка 5000 записей, происходит полный фетч на клиента.
Хинтов оптимизации нет, оптимизатор по умолчанию CBO (стоймостной), индекса по T2.DATE не построено.
Появляется побочный эффект — поле MAX_DATE, но это, я думаю, обходится элементарно.
Благодарности выражать оценкой
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.