Цитата: Mtirt ➤ Ссылка на статью Т. Кайта.
За ссылку отдельное спасибо! Узнал новое для себя, значит день уже прошел не зря :)
По поводу row_number() и того что это будет быстрее.
Рассмотрим простой пример, допустим нужно определить цены последних приходов товаров из ассортимента.
Вариант 1, без использования row_number():
Код:
SELECT c.article as "Артикул",
c.name as "Наименование",
c.wi_docid as "Номер накладной",
d.createdat as "Дата прихода",
dc.itemprice as "Цена прихода"
FROM supermag.smdocuments d,
supermag.smspec dc,
(
SELECT c.article,
c.name,
(SELECT DISTINCT FIRST_VALUE (wid.ID) OVER (ORDER BY wid.createdat DESC ROWS UNBOUNDED PRECEDING)
FROM supermag.smspec wis, supermag.smdocuments wid
WHERE wis.docid = wid.ID AND wis.doctype = wid.doctype AND wid.doctype = 'WI' AND wid.opcode=0
AND wis.article = c.article
AND wid.locationto=(4)
) as wi_docid
FROM supermag.smcard c,
supermag.smcardassort pca,
supermag.sacardassort ca
WHERE pca.article=c.article
AND ca.id=pca.idassort
AND ca.tree LIKE ('2.%')
) c
WHERE d.id=c.wi_docid
AND d.doctype='WI'
AND dc.docid=d.id
AND dc.doctype=d.doctype
AND dc.article=c.article
Теперь вариант 2, с использованием row_number():
Код:
break on c.article skip 1
SELECT * FROM
(
SELECT c.article as "Артикул",
c.name as "Наименование",
d.id,
d.createdat,
row_number() over (partition by c.article order by d.createdat desc) rnk,
dc.itemprice
FROM supermag.smcard c,
supermag.smcardassort pca,
supermag.sacardassort ca,
supermag.smdocuments d,
supermag.smspec dc
WHERE pca.article=c.article
AND ca.id=pca.idassort
AND d.id=dc.docid
AND d.doctype=dc.doctype
AND d.doctype='WI'
AND d.opcode=0
AND c.article=dc.article
AND d.locationto=(4)
AND ca.tree LIKE ('2.%')
ORDER BY c.article
) WHERE rnk=1
Результаты этих запросов идентичны, только первый (без row_number()) выполняется на моей базе 0,44 секунды, а второй - 34,5 сек, т.е. на порядок медленнее, причем я запускал запрос несколько раз, чтоб обеспечить буферизацию нужных данных.
Или я как-то не так запрос написал?