我在查询中使用标量用户定义函数(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分钟
不知道为什么差异如此巨大(3秒vs 4分钟:O)
我不确定,如果这是在这里提问的方式..任何提高查询性能的指导都有很大的帮助..
答案 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最佳做法。