|
![]() |
#1 |
Участник
|
Скорее всего в данном случае вполне можно вместо условия по полям DateFinancial и DateExpected написать условие по одной дате DateStatus. Алгоритм заполнения DateStatus в методе inventTrans.setStatusDate().
|
|
![]() |
#2 |
Участник
|
![]()
Спасибо всем. Немного конкретезирую запрос (было до этого абстрактно):
while select inventTrans where ((inventTrans.TransType == InventTransType::Purch) || (inventTrans.TransType == InventTransType::Sales)) && (includeEstimated || ( ! includeEstimated && ((inventTrans.StatusReceipt == StatusReceipt::None && inventTrans.StatusIssue == StatusIssue::Sold) || (inventTrans.StatusReceipt == StatusReceipt::Purchased && inventTrans.StatusIssue == StatusIssue::None)))) && (transByPeriod && ((inventTrans.DateFinancial && inventTrans.DateFinancial >= dateFrom && inventTrans.DateFinancial <= dateTo) || ( ! inventTrans.DateFinancial && inventTrans.DateExpected >= dateFrom && inventTrans.DateExpected <= dateTo)) || (!transByPeriod)) join ItemCategoryId from inventTable where inventTable.ItemId == inventTrans.ItemId && inventTable.ItemType != ItemType::..... join DlvInventTripId from inventDim where inventDim.InventDimId == inventTrans.InventDimId && (( ! tripId && inventDim.DlvInventTripId != "") || (tripId && inventDim.DlvInventTripId == tripId)) exists join DlvInventTripId from inventDimTripByPeriod where inventDimTripByPeriod.[field] == inventDim.[field] join inventTransByPeriod where inventTransByPeriod.InventDimId == inventDimTripByPeriod.InventDimId && ((inventTransByPeriod.DateFinancial && inventTransByPeriod.DateFinancial >= dateFrom && inventTransByPeriod.DateFinancial <= dateTo) || ( ! inventTransByPeriod.DateFinancial && inventTransByPeriod.DateExpected >= dateFrom && inventTransByPeriod.DateExpected <= dateTo)) Пояснение к запросу inventTransByPeriod это inventtrnas inventDimTripByPeriod это inventDim признаки (NOYES) для запроса: includeEstimated,transByPeriod |
|
![]() |
#3 |
Участник
|
Вторая серия, для начала:
1. Индекс на таблицу inventTrans с 3-мя полями DateFinancial, DateExpected, InventDimId 2. Слегка модифицированный запрос while select inventTrans where ((inventTrans.TransType == InventTransType::Purch) || (inventTrans.TransType == InventTransType::Sales)) && (includeEstimated || ( ! includeEstimated && ((inventTrans.StatusReceipt == StatusReceipt::None && inventTrans.StatusIssue == StatusIssue::Sold) || (inventTrans.StatusReceipt == StatusReceipt::Purchased && inventTrans.StatusIssue == StatusIssue::None)))) && (transByPeriod && ((inventTrans.DateFinancial && inventTrans.DateFinancial >= dateFrom && inventTrans.DateFinancial <= dateTo) || ( ! inventTrans.DateFinancial && inventTrans.DateExpected >= dateFrom && inventTrans.DateExpected <= dateTo)) || (!transByPeriod)) join ItemCategoryId from inventTable where inventTable.ItemId == inventTrans.ItemId && inventTable.ItemType != ItemType::..... join DlvInventTripId from inventDim where inventDim.InventDimId == inventTrans.InventDimId && (( ! tripId && inventDim.DlvInventTripId != "") || (tripId && inventDim.DlvInventTripId == tripId)) exists join DlvInventTripId from inventDimTripByPeriod where inventDimTripByPeriod.[field] == inventDim.[field] join inventTransByPeriod where inventTransByPeriod.InventDimId == inventDimTripByPeriod.InventDimId && inventTransByPeriod.DateFinancial <= dateTo && ((inventTransByPeriod.DateFinancial && inventTransByPeriod.DateFinancial >= dateFrom) || ( ! inventTransByPeriod.DateFinancial && inventTransByPeriod.DateExpected >= dateFrom && inventTransByPeriod.DateExpected <= dateTo)) |
|
![]() |
#4 |
Участник
|
Что будет если запустить запрос на сервере с помощью скажем E...M...?
Обязательно ли использовать While select? |
|
![]() |
#5 |
Участник
|
Alexius,
а нужно ли в запросе использовать волшебные слова forcenestedloop forceselectorder? |
|
![]() |
#6 |
Участник
|
|
|
![]() |
#7 |
Участник
|
Добрый день
Конкретизирую что написал вчера Как бы я поступил: 1. Понял бы куда уходит время: на создание курсора или движение по нему 2. Если на создание - то проверил бы наличие индексов на полях связи и ограничениях, запустил бы запрос на SQL сервере и постарался оптимизировать там. 3. Если получилось - то постарался бы перенести это в Axaptу. Если не получилось перенести, то постарался бы использовать хранимую процедуру на сервере. Если на сервере запрос работает долго - значит не повезло. Остается только постараться получать промежуточные данные в пакетном режиме и затем использовать их 4. Если задержка вызвана движением по курсору - то постарался бы обойтись без него Успехов |
|
Теги |
оптимизация, производительность, ax3.0 |
|
![]() |
||||
Тема | Ответов | |||
Оптимизация запроса - ranges | 13 | |||
Изменить план выполнения запроса | 2 | |||
Быстродействие запроса | 1 | |||
Опять оптимизация запроса | 3 | |||
Оптимизация запроса | 1 |
|