2

次の形式のクエリがあります。

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

実行にかなりの時間がかかるユーザー定義関数であるcostiveop()が、テーブル内のすべての行に対して呼び出されるようです。パフォーマンス上の理由から、結果セットの各行に対して1回だけ実行する必要があります。

私は次のアプローチを試しましたが、違いは見られませんでした。

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とを実行する必要があります。クエリに次のようなものがある場合、すべての行に対してクエリが実行されます。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 に答える