此查询从交货历史记录中为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的帐户。如何针对Excel的Invantive Control中的速度优化此查询?
答案 0 :(得分:1)
这个查询可能每天最多运行一次,因为deliverydate
不包含时间。因此,从ExactOnlineREST..GoodsDeliveries
中选择的行数是几百。根据给出的统计数据,帐户,交付地址和联系人的数量也大约是几百个。
通常情况下,此类查询会通过Exact Online query with joins runs more than 15 minutes之类的解决方案进行优化,但该解决方案不适用于此:join_set(soe, orderid, 100)
的第三个值是左侧的最大行数 - 手边与索引连接一起使用。此时,左侧的最大数量类似于125,基于对Exata Online的OData请求的URL长度的约束。请记住,实际的OData查询是使用URL的GET,而不是过滤器的无限大小的POST。
替代方案是:
在单独的查询中,选择符合条件的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
从exactonlinerest..accounts插入,其中datecreated> TRUNC(SYSDATE)`。
启用Data Replicator后,您可以在Exact Online API实体的内部部署或云关系数据库中自动创建和维护副本。对于低延迟,您需要启用Exact webhooks。
您还可以注册一个请求,让SQL引擎在join_set提示中允许更高的数字,这需要以另一种方式寻址EOL API。或者在Exact注册一个请求,以允许对API的POST请求以及正文中的过滤器。