1

次のインデックスがあります。

CREATE INDEX IF NOT EXISTS dateIdx ON table1 (DateFirstAdded COLLATE NOCASE)

クエリの次の ORDER BY セクションでは、インデックスが正常に使用されています。

ORDER BY DateFirstAdded COLLATE NOCASE ASC LIMIT 100

ただし、次の場合はそうではありません。

ORDER BY DateFirstAdded is null COLLATE NOCASE, DateFirstAdded COLLATE NOCASE ASC LIMIT 100

それを機能させることは可能ですか?もしそうなら、それは私が作成する必要がある新しいインデックスですか、それともクエリの調整ですか?

ありがとう

4

1 に答える 1

1

テーブルからレコードが読み取られたは、インデックスを使用して並べ替えを高速化することはできません。これを使用する唯一の方法は、クエリがテーブルからデータを読み取っているにインデックス エントリをステップ実行することです。

これは、インデックス内のエントリの順序が、ORDER BY 句で指定された順序とまったく同じでなければならないことを意味します。

この場合、DateFirstAdded IS NULL最初の列として持つインデックスはありません (また、SQLite は式インデックスをサポートしていません)。インデックスの最後に NULL レコードがあります。(IS NULL は照合を必要としない 0 または 1 を返すことに注意してください。)

最後に NULL レコードを返し、ソートにインデックスを引き続き使用するには、クエリを非 NULL レコードと NULL レコードを別々に返す複合クエリに分割する必要があります。ORDER BY を使用できるようにするには、サブクエリを使用する必要があります。

SELECT *
FROM (SELECT *
      FROM table1
      WHERE DateFirstAdded IS NOT NULL         -- uses index
      ORDER BY DateFirstAdded COLLATE NOCASE)  -- implied by index scan
UNION ALL
SELECT *
FROM table1
WHERE DateFirstAdded IS NULL                   -- uses index
LIMIT 100
于 2013-11-02T09:35:05.677 に答える