を選択し、次の例で考えてみましょう:このクエリは、ROWID列なしで表を作成し、値を挿入(X、x)をクエリプランナを助けるために 1000年< X < 2000が実行することができますどこSQLiteは間違ったクエリプラン
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INTEGER PRIMARY KEY, b) WITHOUT ROWID;
WITH RECURSIVE
cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000)
INSERT INTO t1(a,b) SELECT x, x FROM cnt;
CREATE INDEX t1b ON t1(b);
を分析する。
ANALYZE;
EXPLAIN QUERY PLAN
SELECT * FROM t1 WHERE b BETWEEN 500 AND 2500;
EXPLAIN QUERY PLAN
SELECT * FROM t1 WHERE b BETWEEN 2900 AND 3000;
いずれの場合も、出力は次のようになります。しかし、とにかく私たちはテーブル全体を反復処理する必要がある理由(最初のクエリのための)インデックスを使用しても意味がない0|0|0|SEARCH TABLE t1 USING COVERING INDEX t1b (b>? AND b<?)
ので、通常のSCAN TABLEはいるようですより効率的です。まさにこの方法でROWID仕事を持つテーブルに:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a, b);
WITH RECURSIVE
cnt(x) AS (VALUES(1000) UNION ALL SELECT x+1 FROM cnt WHERE x<2000)
INSERT INTO t1(a,b) SELECT x, x FROM cnt;
CREATE INDEX t1a ON t1(a);
ANALYZE;
EXPLAIN QUERY PLAN
SELECT * FROM t1 WHERE a BETWEEN 500 AND 2500;
EXPLAIN QUERY PLAN
SELECT * FROM t1 WHERE a BETWEEN 2900 AND 3000;
この場合、出力は次のようになります。0|0|0|SCAN TABLE t1
と0|0|0|SEARCH TABLE t1 USING INDEX t1a (a>? AND a<?)
ので、誰でも問い合わせプランナがROWIDテーブルなしのクエリを最適化する方法を説明できますか?
私は本当に何人かの人々がこのような素敵な質問にDV理由を理解しません。彼らはその質問を読んだり理解したりするのでしょうか?私は釣り合いを取るためにupvoted;) –