1

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

4

1 回答 1

1

可能此查询每天最多运行一次,因为deliverydate不包含时间。因此,从中选择的行ExactOnlineREST..GoodsDeliveries数为数百。根据给出的统计数据,账户、收货地址和联系人的数量也大约有数百个。

通常,此类查询将通过诸如Exact Online query with joins running over 15 minutes之类的解决方案进行优化,但该解决方案在这里不起作用:a 的第三个值join_set(soe, orderid, 100)是左侧的最大行数与索引连接一起使用。此时,左侧的最大数量约为 125,这取决于对 Exact Online 的 OData 请求的 URL 长度的限制。请记住,实际的 OData 查询是使用 URL 的 GET,而不是过滤器大小不受限制的 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而不是原来的 from 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 where datecreated > trunc(sysdate)”。

数据复制器

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

有 SQL Engine 或 Exact 适配

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

于 2017-06-03T12:49:31.817 回答