Как этот запрос может быть оптимизирован для скорости?

Этот запрос создает экспорт для 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 с неограниченным размером фильтра.

Альтернативы:

  1. Сплит громкость
  2. Кэш данных
  3. Репликатор данных
  4. Есть движок 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 с фильтром в теле.

Другие вопросы по тегам