首页 > 解决方案 > itgendch033:后备数据库需要 Invantive Data Replicator 将“ExactOnlineXML.XML.SubscriptionLines”的列数限制为 1,000

问题描述

执行批处理脚本以从 Exact Online 复制我的数据时,我收到以下错误:

错误 itgencun016:感叹号 itgendch033:后备数据库需要 Invantive Data Replicator 将“ExactOnlineXML.XML.SubscriptionLines”的列数限制为 1,000。

它发生在以下查询中:

select /*+ ods(true, interval '20 hours') */ count(*) 
from   ExactOnlineXML.XML.SubscriptionLines

也一样ExactOnlineXML.XML.InvoiceLines

如何在不最大化列的情况下复制这些表。

标签: exact-onlineinvantive-sqlinvantive-data-hub

解决方案


Invantive SQL 对列名的长度以及表或视图的列数没有任何限制。

然而,传统数据库是在另一个时代设计的,通常被限制为例如 30..128 个字符的列名和 1.000、1.024 或几千列。请记住,Oracle 在 64 KB(32 K 代码,32 K 数据)上运行;这大约是这个问题和答案的大小:-)

当从 Exact Online 复制数据到 Oracle、SQL Server 或 PostgreSQL 等传统数据库时,Invantive Data Hub 将使用 Invantive SQL 从 Exact Online 中检索数据,然后将其批量加载到数据库中。

但是,数据必须同时适合列名和列号。

这就是列名如此奇怪的主要原因;它们适合有限数量的字符,与原始列名无关。通过删除具有唯一 MD5 散列的中心部分,生成的视图的列名也被缩短。

对于列数,Data Hub 只是严格检查您的源不超过 1.000 列的限制。Exact Online XML API 没有描述可以用值填充哪些列的文档;只是一个描述所有理论可能性的 XSD,导致数百万列。

大多数 Exact Online 基于 XML 的表已被调整为排除没有值的列名路径,但它们通常不适合 1.000 列。

可能的解决方案是:

  • 使用 Exact Online REST API 变体,它经常出现,有时在功能和性能上也相似(并非总是如此,XML API 是旧的,但通常更好地设计用于可用性)。所以检查是否有ExactonlineREST..SubscriptionLines.
  • 详尽地描述要复制的列。

描述要复制的列

最后一个解决方案有点复杂。它还拒绝使用诸如涓流加载(使用网络挂钩)或智能采样等高级策略;它只是带有或不带有版本控制的普通副本。

作为示例,当连接到 Data Replicator 环境时,我对 200 家有订阅的 Exact 公司进行了查询:

订阅行的正常查询

请注意,/*+ ods(true) */不存在,而是隐含地假设;当还连接到 Data Replicator 时,默认情况下会进行复制。

通过添加/*+ ods(false) */,您可以有效地告诉 SQL 引擎不要将要复制到数据库中的数据发送到 Data Replicator 提供程序。

当我运行它时,还有另一个错误itgenugs026(请求的列数超过了结果网格中支持显示的最大数量):

错误 2

这实际上是一个渲染错误;查询工具中使用的网格将自身限制为 1.000 列。较大数量的列会导致 UI 响应时间非常慢。

通过单击“隐藏空列”按钮或使用 Invantive Data Hub 作为用户界面,您可以获得实际结果:

精确在线 XML 订阅的结果

注意工具提示:标题显示有些自然的标签,但实际的列名显示在工具提示中。

写下您需要的列名,并仅使用您需要的列填充内存表,例如:

create or replace table my_subscriptions@inmemorystorage
as
select /*+ ods(false) */ 
       subscription_number_attr 
,      subscription_description
from   exactonlinexml..subscriptionlines

现在以正常方式复制此表:

select /*+ ods(true, interval '1 second') */ 
       count(*) some_unneeded_data_to_force_replication
from   my_subscriptions@inmemorystorage

请注意,必须存在 ODS 提示。默认情况下从不复制内存中的表。

您可以使用刷新alter persistent cache [force] refresh,但内存表必须已提前填写。

存储库中的结果条目将是:

存储库更改

事实表(请参阅 dcs_.... 了解具有时间旅行的 Data Vault)是:

原始事实支持表

并且默认命名视图是 imy_my_subscriptions_r(imy 是 'inmemorystorage' 驱动程序的缩写):

默认当前版本视图


推荐阅读