[ОТВЕТИТЬ]
Опции темы
28.12.2007 10:30  
isi
Да, по моему от туда и выдрано :)
 
04.02.2008 09:15  
isi
Вообщем вот таким запросом можно быстро получить цену последнего прихода очень быстро:

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 smspec.docid = smspec.docid
AND smspec.article IN ('79290')
AND smdocuments.locationto IN (16)
and smdocuments.docstate in (2,3)
order by smdocuments.createdat desc
) a
where ROWNUM = 1
 
04.02.2008 09:45  
kadr
Цитата:
Сообщение от isi
Вообщем вот таким запросом можно быстро получить цену последнего прихода очень быстро:
на каких объёмах тестировалось? Быстро - это достаточно абстрактная величина, а если нужно получить последнюю цену для кучи (~10000) артикулов и нескольких МХ тоже быстро отрабатывает?
 
04.02.2008 10:01  
isi
На центральной БД в 80 Гигов, запрос возвращает только первую запись, если надо для нескольких то его в место поля, попробуй, я сам удивился производительности, нашел реализацию у Том Кайт тут:
 
04.02.2008 14:21  
kadr
Цитата:
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 smspec.docid = smspec.docid

а это зачем? какой тайный смысл
Цитата:
AND smspec.article IN ('79290')
AND smdocuments.locationto IN (16)
and smdocuments.docstate in (2,3)
order by smdocuments.createdat desc
) a
where ROWNUM = 1
 
04.02.2008 14:36  
kadr
исходные данные

Код:
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. аналитические функции у того же Кайта очень хорошо рассмотрены
 
04.02.2008 15:53  
isi
собственно сейчас с аналитическими фнкциями и разбираюсь, базы под рукой нет сейчас, завтра выложу свою статистику, в моем варианте у меня ответ при любых условиях был сравним с реакцией интерфейса при одном но, если был хотя бы один приход по мх+артикул, если же прихода не было, то ответ доходил до 30 сек
 
04.02.2008 16:27  
kadr
Цитата:
Сообщение от isi
в моем варианте у меня ответ при любых условиях был сравним с реакцией интерфейса при одном но, если был хотя бы один приход по мх+артикул, если же прихода не было, то ответ доходил до 30 сек

1. при использовании интерфейса СМ генерится куча рекурсивных запроосов, значит нам надо стремиться чтобы работало быстрее.

2. если у меня прихода не было, то твой вариант всё-равно выдавал строки
 
04.02.2008 23:10  
mighty
Если в конструкцию ROW_NUMBER() OVER (PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
добавить A2.LOCATIONTO то можно заремить отбор по месту хранения и получать последние закупочные цены по одному товару по всем местам хранения
ROW_NUMBER() OVER (PARTITION BY A2.LOCATIONTO,B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN

И еще важно отсекать оприходование недостачи, то есть добавить условие A2.OPCODE=0

Итого:
SELECT *
FROM (SELECT A2.CREATEDAT,
A2.ID,
A2.LOCATIONTO,
B2.ARTICLE,
B2.ITEMPRICE,
B2.QUANTITY,
B2.TOTALPRICE,
ROW_NUMBER() OVER (PARTITION BY A2.LOCATIONTO,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.OPCODE=0
-- AND A2.LOCATIONTO IN (2015)
AND A2.DOCTYPE = 'WI' -- определение последнего поставщика
AND B2.ARTICLE IN ('18500'))
WHERE RN = 1
 
05.02.2008 03:07  
isi
Ну вот видете вместе получилось довести до ума запрос, который многим начинающим нужен :)
 
 


Опции темы



Часовой пояс GMT +3, время: 09:10.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.