使用标量UDF,SQL,sybase iq

时间:2015-12-31 01:14:40

标签: sql insert sybase udf sybase-iq

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

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

然而,
SELECT *,fn_get(i) INTO #temp2 FROM #temp1;
通过花费> 4分钟

的时间将相同的10,000个结果插入到表#temp2中

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

2 个答案:

答案 0 :(得分:1)

迈克尔是正确的,如果表非常宽我会期望在插入整个表宽度l时出现巨大的性能损失,所以你的第一步应该是只选择/插入int值并看看性能是什么样的。

在那之后,我想让你尝试的另一件事是将你的UDF切换到一个非常简单的(可能只乘以10),看看是否表现得那么慢。

我要求你测试一下,因为我在sybase IQ中遇到的一个有趣的事情是,如果你使用的是IQ不支持的操作,但ASA商店支持 ,那就是你将越过引擎边界。如果您在“系统中”创建了UDF,这也可能发生,这意味着它位于ASA存储中。如果#temp2表在IQ存储中,则将从IQ读取数据移动,移动到ASA以执行数据操作,然后最终返回IQ(缓慢)以写入临时表。根据我的经验,数据从IQ引擎快速移动到ASA引擎,但在另一个方向上移动速度要慢得多。

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

答案 1 :(得分:0)

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

现在很多事情都会影响写入性能,存储类型,IO带宽,缓存,索引等几个因素。

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

SAP has a detailed document on Sybase IQ execution/query plans。它可能不适用于您运行的特定IQ版本,但信息通常适用。

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