我对表格有疑问:
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)
有什么想法吗?
答案 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应该在执行昂贵操作之前执行where
和group 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)