使用标量 UDF 的性能问题,SQL,sybase iq

Performance issue on using scalar UDFs , SQL, sybase iq

我在查询中使用标量用户定义函数 (UDF) 时遇到性能问题。
有一个 UDF fn_get(i int) returns 一个标量..它包含很多逻辑并执行正常的标量操作..


其实
SELECT *,fn_get(i) FROM #temp1;
正在 3 秒内获取 10,000 个结果并显示在 Studio UI。


然而,
SELECT *,fn_get(i) INTO #temp2 FROM #temp1;
将相同的 10,000 个结果插入 table #temp2,耗时 >4 分钟


不知道为什么差别这么大(3秒对4分钟:O)
我不确定,如果这是在这里提问的方式。任何提高查询性能的指导都有很大帮助。

Sybase IQ 是一个 OLAP 优化的列式数据库。这意味着,开箱即用,它针对读取而不是写入进行了调整。因此,读取性能大大超过写入性能是正常的,即使在相同的数据集上也是如此。

现在有很多因素会影响写入性能,存储类型、IO 带宽、缓存、索引是其中的几个因素。

要获得有关查询细节的更多详细信息,您应该查看执行计划。这将有助于分解系统花费时间的地方。

SAP has a detailed document on Sybase IQ execution/query plans。它可能不适用于您所使用的特定 IQ 版本 运行,但这些信息将普遍适用。

注意: 强烈建议不要在列式数据库中使用 select *(永远)。数据按列拆分和组织,因此重新组合整行是一个非常昂贵的过程。除非您绝对需要行中的每一列,否则您应该始终指定哪些列。始终在查询中指定列也是一般的 SQL 最佳实践,即使您要检索所有列也是如此。

Michael 是正确的,如果 table 非常宽,我预计插入整个 table 宽度 l 会产生巨大的性能影响,所以你的第一步应该只是 select/insert int 值,看看性能如何。

在那之后,我希望您尝试的另一件事是将您的 UDF 切换为非常简单的 UDF(可能只是乘以 10),看看执行速度是否一样慢。

我请你测试一下,因为我在 sybase IQ 中使用 UDF 时遇到的一件有趣的事情是,如果你使用 IQ 不支持但 支持的操作ASA store,是你将跨越的引擎边界。如果您创建了 UDF "in system",这意味着它在 ASA 商店中,也可能会发生这种情况。如果您的#temp2 table 在 IQ 存储中,数据移动将从 IQ 读取,移至 ASA 以执行数据操作,然后最终移回 IQ(缓慢地)写入您的临时 table .根据我的经验,数据从 IQ 引擎移动到 ASA 引擎的速度非常快,但从另一个方向移动的速度要慢得多。

这就是为什么我认为 select 很快(它在数据操作后直接来自 ASA 存储)并且插入速度几乎慢 100 倍。