sqlite group-by с sort-by-desc не работает должным образом - PullRequest
1 голос
/ 19 сентября 2019

У меня есть сводный запрос, правильно проиндексированный для быстрого возврата упорядоченных результатов (простое сканирование индекса).Это работает, как и ожидалось, когда упорядочение по возрастанию (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 и агрегатах, или я ожидаю / делаю что-то не так?

1 Ответ

1 голос
/ 19 сентября 2019

Код для зацикливания индекса возвращается только тогда, когда это необходимо.Для реализации самой GROUP BY обратный путь никогда не требуется, поэтому его никогда не пробуют.

В ответ на ваш отчет в списке рассылки sqlite-users версия SQLite 3.30.0 будет иметь код чтобы справиться с этим делом:

    /* The GROUP BY processing doesn't care whether rows are delivered in
    ** ASC or DESC order - only that each group is returned contiguously.
    ** So set the ASC/DESC flags in the GROUP BY to match those in the 
    ** ORDER BY to maximize the chances of rows being delivered in an 
    ** order that makes the ORDER BY redundant.  */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...