Запоминаются ли вызовы функций в sqlite?

Вот настройка:

.open ':memory:'

CREATE TABLE foos (x INTEGER);
INSERT INTO foos (x)
VALUES (1), (1), (2), (1), (3), (2);

Это запрос (назовем его query1)

SELECT x, count(x)
FROM foos
GROUP BY x
HAVING count(x) > 1;

медленнее, чем этот запрос (query2):

SELECT x, count(x) AS xcnt
FROM foos
GROUP BY x
HAVING xcnt > 1;

Другими словами, возвращаемое значение query1count(x) неявно запоминается и повторно используется в предложении HAVING, или оно действительно вызывается дважды?

Результатом вышеизложенного является

1|3
2|2
1|3
2|2

Обновлено:

Поместив EXPLAIN QUERY PLAN над выходами обоих запросов:

0|0|0|SCAN TABLE foos
0|0|0|USE TEMP B-TREE FOR GROUP BY
0|0|0|SCAN TABLE foos
0|0|0|USE TEMP B-TREE FOR GROUP BY

что происходит, когда вы их запускаете? Объясните план: sqlite.org/eqp.html

Mitch Wheat 21.03.2018 03:05

@MitchWheat Я внес правки, чтобы прояснить свой пост, и добавил информацию, которую вы просили

solstice333 21.03.2018 03:32
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это один и тот же запрос.

Кроме того, вам, вероятно, следует создать индекс на x.

Хм, для записи это был не я. Я нашел ваш ответ ясным и полезным. Я поддержу ваш ответ, чтобы уравновесить весы.

solstice333 28.03.2018 23:05

Другие вопросы по теме