У меня есть сводный запрос, правильно проиндексированный для быстрого возврата упорядоченных результатов (простое сканирование индекса).Это работает, как и ожидалось, когда упорядочение по возрастанию (ASC), но изменение порядка (DESC) приводит к созданию sqlite TEMP B-TREE
sqlite версии 3.26.0
CREATE TABLE t1(x,y);
INSERT INTO t1 VALUES(1,1);
INSERT INTO t1 VALUES(1,2);
INSERT INTO t1 VALUES(2,1);
CREATE INDEX ix1 ON t1(x,y);
EXPLAIN QUERY PLAN SELECT x,max(y) FROM t1 GROUP BY x ORDER BY x;
EXPLAIN QUERY PLAN SELECT x,max(y) FROM t1 GROUP BY x ORDER BY x DESC; -- This query constructs a TEMP B-TREE, why?
При запускеВ приведенном выше коде вы увидите, что запрос 1 просто выполняет сканирование индекса, в то время как запрос 2, в дополнение к выполнению сканирования индекса, также создает TEMP B-TREE для упорядочивания результата, снижая производительность.
Созданный индекс поддерживает обходв обоих направлениях, поэтому я ожидаю одинаковую производительность для упорядочения ASC и DESC.
Это известное ограничение в sqlite и агрегатах, или я ожидаю / делаю что-то не так?