SQLite查询中的操作顺序

时间:2013-01-08 18:16:39

标签: sqlite user-defined-functions

我对表格有疑问:

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

看来,对于表中的所有行,都会调用expensiveop() - 这是一个需要花费大量时间执行的用户定义函数。出于性能原因,我只希望它对结果集中的每一行执行一次。

我尝试了以下方法,这似乎没有什么区别:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

解决方法的想法:

SELECT akey, avalue, CASE avalue < SOME_CONSTANT WHEN 0 THEN NULL ELSE expensiveop(akey) END FROM avalue WHERE avalue < SOME_CONSTANT

答案 1 :(得分:0)

另一个想法是:

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

SQL应该在执行昂贵操作之前执行wheregroup by ,因为它使用聚合的“akey”。如果查询的内容类似于min(expensiveop(akey)),那么它将为每一行执行此操作。

答案 2 :(得分: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)