2

我有一个表格查询:

SELECT akey, avalue, expensiveop(akey) FROM atable WHERE avalue < SOME_CONSTANT;

看起来昂贵的op()——这是一个用户定义的函数,需要相当长的时间来执行——被表中的所有行调用。出于性能原因,我只希望它对结果集中的每一行执行一次。

我尝试了以下方法,但似乎没有什么不同:

SELECT akey, avalue, expensiveop(akey) FROM (SELECT * FROM atable WHERE avalue < SOME_CONSTANT) 

有任何想法吗?

4

3 回答 3

0

解决方法的想法:

SELECT akey, avalue, CASE avalue < SOME_CONSTANT WHEN 0 THEN NULL ELSE expensiveop(akey) END FROM avalue WHERE avalue < SOME_CONSTANT
于 2013-01-08T18:23:27.657 回答
0

另一个想法是:

SELECT akey, avalue, expensiveop(akey)
FROM atable
WHERE avalue < SOME_CONSTANT
group by akey, avalue

SQL 应该在执行昂贵的操作之前where执行and ,因为它使用聚合的“akey”。如果查询有类似的东西,那么它将为每一行执行它。group by min(expensiveop(akey))

于 2013-01-08T18:38:55.977 回答
0

您可以在此页面上了解 SQLite 的优化器,尤其是子查询扁平化部分: http ://www.sqlite.org/optoverview.html#flattening

它包含一个包含 19 个条件的列表,所有这些条件都必须满足才能允许子查询展平。选择一个,并按照它所说的完全相反,例如一些随机示例(未经测试):

 SELECT akey, avalue, expensiveop(akey)
 FROM (SELECT * FROM atable WHERE avalue < SOME_CONSTANT LIMIT 99999999)
 LIMIT 99999999

 SELECT akey, avalue, expensiveop(akey) FROM
(SELECT * FROM atable WHERE avalue < SOME_CONSTANT
 UNION
 SELECT * FROM atable WHERE 0 GROUP BY avalue)

 SELECT akey, avalue, expensiveop(akey) FROM
(SELECT * FROM atable WHERE avalue < SOME_CONSTANT LIMIT -1 OFFSET 0)
于 2013-01-08T18:39:24.777 回答