Как этот запрос может быть оптимизирован для скорости?
Этот запрос создает экспорт для UPS из истории поставок:
select 'key'
, ACC.Name
, CON.FullName
, CON.Phone
, ADR.AddressLine1
, ADR.AddressLine2
, ADR.AddressLine3
, ACC.Postcode
, ADR.City
, ADR.Country
, ACC.Code
, DEL.DeliveryNumber
, CON.Email
, case
when CON.Email is not null
then 'Y'
else 'N'
end
Ship_Not_Option
, 'Y' Ship_Not
, 'ABCDEFG' Description_Goods
, '1' numberofpkgs
, 'PP' billing
, 'CP' pkgstype
, 'ST' service
, '1' weight
, null Shippernr
from ExactOnlineREST..GoodsDeliveries del
join ExactOnlineREST..Accounts acc
on ACC.ID = del.DeliveryAccount
join ExactOnlineREST..Addresses ADR
on ADR.ID = DEL.DeliveryAddress
join ExactOnlineREST..Contacts CON
on CON.ID = DEL.DeliveryContact
where DeliveryDate between $P{P_SHIPDATE_FROM} and $P{P_SHIPDATE_TO}
order
by DEL.DeliveryNumber
Это займет много минут, чтобы бежать. Количество доставок и счетов растет с нескольких сотен каждый день. Адреса и контакты в основном 1:1 со счетами. Как можно оптимизировать этот запрос для скорости в Invantive Control for Excel?
1 ответ
Вероятно, этот запрос выполняется не чаще одного раза в день, так как deliverydate
не содержит времени. Таким образом, количество строк, выбранных из ExactOnlineREST..GoodsDeliveries
это несколько сотен. Исходя из приведенной статистики, количество учетных записей, адресов доставки и контактов также составляет приблизительно несколько сотен.
Обычно такой запрос оптимизируется таким решением, как Exact Online, запрос с объединениями выполняется более 15 минут, но это решение здесь не сработает: третье значение join_set(soe, orderid, 100)
максимальное количество строк в левой части, которое будет использоваться с индексными объединениями. На данный момент максимальное число слева равно 125, основываясь на ограничениях на длину URL для запросов OData к Exact Online. Пожалуйста, помните, что фактический запрос OData - это GET с использованием URL, а не POST с неограниченным размером фильтра.
Альтернативы:
- Сплит громкость
- Кэш данных
- Репликатор данных
- Есть движок SQL или Exact Online адаптированный:-)
Разделить громкость
В отдельном запросе выберите подходящих GoodsDeliveries
и поместите их в таблицу в памяти или в базу данных, используя, например:
create or replace table gdy@inmemorystorage as select ... from ...
Затем создайте временную таблицу на 100 или похожие строки, такие как:
create or replace table gdysubpartition1@inmemorystorage as select ... from ... where rowidx$ between 0 and 99
... etc for 100, 200, 300, 400, 500
А затем выполните запрос несколько раз, каждый раз с другим gdysubpartition1
..gdysubpartition5
вместо оригинала из ExactOnlineREST..GoodsDeliveries
,
Конечно, вы также можете избежать использования промежуточных таблиц, используя встроенное представление, например:
from (select * from goodsdeliveries where date... limit 100)
или так.
Кэш данных
Когда вы выполняете запрос несколько раз в день (маловероятно, но я не знаю), вы можете кэшировать учетные записи в реляционной базе данных и обновлять их каждый день.
Вы также можете использовать локальный буфер обмена для запоминания результатов. and
локальный буфер результатов сохранения в to save the last results to a file manually and later restore them using
буфер результатов локальной загрузки из...and
локальный буфер результатов вставки в таблицу . And maybe then
вставить в fromreculelinelinerest..accounts, где datecreated > trunc(sysdate)`.
Репликатор данных
При включенном репликаторе данных можно автоматически создавать и поддерживать реплики в локальной или облачной реляционной базе данных для объектов Exact Online API. Для низкой задержки вам необходимо включить точные веб-зацепки.
Есть SQL Engine или Exact адаптированы
Вы также можете зарегистрировать запрос на использование механизма SQL, чтобы разрешить большее число в подсказке join_set, что потребовало бы обращения к API-интерфейсам EOL другим способом. Или зарегистрируйте запрос в Exact, чтобы также разрешить запросы POST к API с фильтром в теле.