исходные данные
Код:
SELECT COUNT(*) FROM smdocuments
3856280
Код:
select count(*) from smspec
159247539
вот немного переписанный запрос автора
Код:
SELECT /*+ FIRST_ROWS(n) */
A.*, ROWNUM RNUM
FROM (SELECT SMDOCUMENTS.CREATEDAT,
SMDOCUMENTS.ID,
SMDOCUMENTS.LOCATIONTO,
SMSPEC.ARTICLE,
SMSPEC.ITEMPRICE,
SMSPEC.QUANTITY,
SMSPEC.TOTALPRICE
FROM SMDOCUMENTS, SMSPEC
WHERE SMSPEC.DOCTYPE = SMDOCUMENTS.DOCTYPE
AND SMDOCUMENTS.ID = SMSPEC.DOCID
AND SMSPEC.ARTICLE IN ('18500')
AND SMDOCUMENTS.LOCATIONTO IN (2015)
AND SMDOCUMENTS.DOCSTATE IN (2, 3)
AND SMDOCUMENTS.DOCTYPE='WI'
ORDER BY SMDOCUMENTS.CREATEDAT DESC) A
WHERE ROWNUM = 1
в период очччень хорошей загрузки базы
от 15 до 200 сек.
Код:
SELECT *
FROM (SELECT A2.CREATEDAT,
A2.ID,
A2.LOCATIONTO,
B2.ARTICLE,
B2.ITEMPRICE,
B2.QUANTITY,
B2.TOTALPRICE,
ROW_NUMBER() OVER(PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2
WHERE A2.DOCTYPE = B2.DOCTYPE
AND A2.ID = B2.DOCID
AND A2.DOCSTATE IN (2, 3)
AND A2.LOCATIONTO IN (2015)
AND A2.DOCTYPE = 'WI' -- определение последнего поставщика
AND B2.ARTICLE IN ('18500'))
WHERE RN = 1
в тот же период
от 0,01 до 5 секунд
P.S. аналитические функции у того же Кайта очень хорошо рассмотрены