Я запрашиваю схему веб-трафика, чтобы определить, какие визиты являются исходными и какие возвращаются.Оптимальный запрос для dense_rank, чтобы найти кратные
У меня есть две таблицы СЕССИЯ И АЛИАС.
CREATE TABLE alias (
person_id vachar(24),
alias varchar(24)
)
CREATE TABLE session (
session_id vachar(24),
alias varchar(24) -- FK to alias
last_seen timestamp
)
Таблица сеансов представляет веб-визиты для псевдонимов, а таблица псевдонима содержит псевдонимы для человека. Я пытаюсь создать представление о сеансе, которое позволит мне отметить сеанс как «Первый визит» лицом или «Возврат посетителя» лицом (отсюда и присоединиться к псевдониму ниже).
Решение, которое я имею до сих пор, использует функцию окна с dense_rank следующим образом.
CREATE VIEW session_augmented as (
SELECT S.session_id, S.last_seen, ....
CASE
WHEN dense_rank()
OVER (partition by A.person_id COLLATE "C" ORDER by S.last_seen) = 1
THEN 'First Visit'
ELSE 'Return Visit'
END as visit_type
FROM session S
JOIN alias A ON (S.person_alias = A.alias)
)
Я создал индексы, охватывающие диапазон запросов, включая соединение выше.
В приведенном ниже пояснении показана проверка Seq Scan на сеансе, даже если столбец person_alias индексирован. Ниже приведено объяснение: https://explain.depesz.com/s/2LJ
Запрос выполняется медленнее, чем я хотел бы, есть ли способ оптимизации? Есть ли лучший подход, который достигает результата, который я получил?
Интересное решение. Однако на самом деле это было не так быстро, как в исходном вопросе. – maxTrialfire
Виновник по-прежнему относится к типу: https://explain.depesz.com/s/ZTO – maxTrialfire
Фактически, добавив некоторые индексы, я смог получить мой первоначальный запрос для выполнения лучших результатов: https://explain.depesz.com/s/m5E – maxTrialfire