Здравствуйте, 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, но это, я думаю, обходится элементарно.
Благодарности выражать оценкой
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...