Будет ли LEFT JOIN View с GROUP BY внутри делать правильные вещи? - PullRequest
0 голосов
/ 27 мая 2011

Могу ли я рассчитывать на SQLite при выполнении "правильных действий (TM)"?

CREATE TABLE IF NOT EXISTS user.Log (
    term TEXT,
    seen DATETIME
);
CREATE INDEX IF NOT EXISTS user.Log_term ON Log(term);
CREATE VIEW IF NOT EXISTS user.History AS
SELECT term, COUNT(1) as timesseen, MAX(seen) as lastseen 
FROM user.Log GROUP BY term;

А потом

INNER JOIN History h ON h.term = t.term

Журнал может быть в сотнях тысяч. Я хотел бы знать, передаст ли SQLite h.term = t.term в View, чтобы он группировал только термины, соответствующие ON, вместо группировки всей таблицы, а затем применял ON.

Если это плохая идея, запрашивается лучший способ. (Возможно, лучший способ - сохранить две таблицы: журнал и обобщенную историю.)

1 Ответ

0 голосов
/ 27 мая 2011

Как правило, предложение group by приводит к тому, что оператор теряет связь с исходной строкой, поэтому он не будет использовать индекс, если вы ограничите свое представление объединением: вы будете читать всю таблицу независимо от того.

Что вам нужно сделать, это ограничить его и затем group.Избегайте агрегатных функций в представлениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...