如何针对速度优化此查询?

时间:2017-06-03 06:20:03

标签: exact-online invantive-sql invantive-control

此查询从交货历史记录中为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中的速度优化此查询?

1 个答案:

答案 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。

替代方案是:

  1. 拆分卷
  2. 数据缓存
  3. Data Replicator
  4. 让SQL引擎或Exact Online适应: - )
  5. 分割卷

    在单独的查询中,选择符合条件的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

    启用Data Replicator后,您可以在Exact Online API实体的内部部署或云关系数据库中自动创建和维护副本。对于低延迟,您需要启用Exact webhooks。

    让SQL引擎或Exact适应

    您还可以注册一个请求,让SQL引擎在join_set提示中允许更高的数字,这需要以另一种方式寻址EOL API。或者在Exact注册一个请求,以允许对API的POST请求以及正文中的过滤器。