Показать сообщение отдельно
Старый 05.02.2009, 12:01   #117  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Вопрос:
Виталик, а ты проверил, что второй запрос действительно отрабатывает быстрее?
Я понимаю, что "должно". Но проверял ли?
К сожалению,у меня нет под рукой базы с большим количеством данных в этих таблицах, чтоб сделать такую проверку.
Но судя по планам испольнения и стоимости запросов - да:
Вот примеры обоих запросов на сиквела 2005 (на оракле примерно то же самое)
X++:
SELECT SUM(A.LINEAMOUNT),A.ITEMID,B.ENDDISC
FROM SALESLINE A,INVENTTABLEMODULE B
WHERE ((A.DATAAREAID=?)
AND ((A.SALESID=?)
AND (A.ITEMID>?)))
AND ((B.DATAAREAID=?)
AND (((B.ITEMID=A.ITEMID)
AND (B.MODULETYPE=?))
AND (B.ENDDISC=?)))
GROUP BY A.ITEMID,B.ENDDISC
ORDER BY A.ITEMID,B.ENDDISC

SELECT SUM(A.LINEAMOUNT)
FROM SALESLINE A,INVENTTABLEMODULE B
WHERE ((A.DATAAREAID=?)
AND ((A.SALESID=?)
AND (A.ITEMID>?)))
AND ((B.DATAAREAID=?)
AND (((B.ITEMID=A.ITEMID)
AND (B.MODULETYPE=?))
AND (B.ENDDISC=?)))
Как видите, запросы не сильно отличаются, но в исходном варианте добавляется GROUP BY ... ORDER BY ....
Такая же ситуация и с планами - они практически идентичны, но в первом случае есть ещё sort/aggregate в конце, что существенно увеличивает его стоимость: на сиквеле где-то в 1.5 раза, на оракле в 2. (ну это естественно приблизительные оценки на малых объёмах)
По времени на малых объёма различие в доли секунды - второй быстрее.
Изменение джоина на exists практически никакого изменения не приносит.

Цитата:
Сообщение от kashperuk Посмотреть сообщение
И еще - кто-то согласен, что проверка на заполненность ItemId - лишняя?
Или думаете специально рассчитано на ситуацию, когда ItemId пустое и в InventTableModule, и в PriceDiscLine...?
Нет, я не согласен...
Насколько я понимаю по логике общая скидка применяется только к строкам по тем номенклатурам, у которых стоит птичка "общая скидка" в соответсвующем InventTableModule..
Рассчитано наоборот на ситуацию, когда ItemId НЕпустое и в InventTableModule, и в PriceDiscLine...

Цитата:
Сообщение от kashperuk Посмотреть сообщение
И еще вопрос - точнее, скорее таки баг.
У вас тоже переменная priceDiscLine используется в запросе (хотя она передается как параметр), а после использования в запросе передается параметром в класс PriceDisc?
параметром в класс PriceDisc передаются поля записи priceDiscLine, а не сама priceDiscLine, разве не так?
А то что эта переменная-параметр используется в запросе, это вроде как раз нормально - посмотрите как этот метод вызывается в соответсвующих таблицах:
f.e. метод на таблице SalesTable:
X++:
server void  updateFinalDisc()
{
    SalesLine salesLine;
    ;

    this.PriceDiscHeading::updateFinalDisc(salesLine);

     //This will trigger the creditlimit calculation when salesTable.validateWrite is called
    this.Touched = NoYes::Yes;
}
Как видите salesLine тут используется как бы для инициализации мап-переменной PriceDiscLine нужным буфером...
__________________
Zhirenkov Vitaly