exact-online - 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
。
如何在不最大化列的情况下复制这些表。
解决方案
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(请求的列数超过了结果网格中支持显示的最大数量):
这实际上是一个渲染错误;查询工具中使用的网格将自身限制为 1.000 列。较大数量的列会导致 UI 响应时间非常慢。
通过单击“隐藏空列”按钮或使用 Invantive Data Hub 作为用户界面,您可以获得实际结果:
注意工具提示:标题显示有些自然的标签,但实际的列名显示在工具提示中。
写下您需要的列名,并仅使用您需要的列填充内存表,例如:
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' 驱动程序的缩写):
推荐阅读
- macos - Cocoa:如何一次关闭多个模态窗口/模态视图控制器?
- java - 像这样 Java“实例过滤”[RabbitMQ] 处理消息的最 Pythonic 方式是什么
- html - 从 html 获取值到样式元素
- python - 如何在 SymPy 的“inverse_laplace_transform”函数中指定收敛区域?
- android - 如何在 Android Room 中加入同一对象的多个实例?
- javascript - Safari Mobile 中的 EXIF 方向问题
- swift - 如何使用 SwiftUI 呈现小页面?
- sql - 删除行“A”,其“目标”值已存在于“B”行的“源”值中
- aws-amplify - Grisome 构建在本地成功,但在 AWS Amplify 上失败
- date - 时态表上的 powerbi 单日期过滤器(生效日期从和到)