Индексът може да индексира само действителни редове, а не обобщени редове. Така че, да, що се отнася до желания индекс, създаването на таблица с уникални стойности, както споменахте, е единствената ви опция. Наложете референтна цялост с ограничение за външен ключ от data.day
до days.day
. Това може също са най-добри за производителност, в зависимост от цялата ситуация.
Все пак, тъй като става дума запроизводителност , има алтернативно решение:можете да използвате рекурсивен CTE, за да емулирате сканиране на свободен индекс:
WITH RECURSIVE cte AS (
( -- parentheses required
SELECT day FROM data ORDER BY 1 LIMIT 1
)
UNION ALL
SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
FROM cte c
WHERE c.day IS NOT NULL -- exit condition
)
SELECT day FROM cte;
Скоби около първия SELECT
се изискват поради прикачения ORDER BY
и LIMIT
клаузи. Вижте:
Това се нуждае само от обикновен индекс на day
.
Има различни варианти в зависимост от действителните ви заявки:
- Оптимизиране на заявката GROUP BY за извличане на най-новия ред на потребител
- Неизползван индекс в заявка за диапазон от дати
- Изберете първо ред във всяка група GROUP BY?
Повече в отговора ми на последващия ви въпрос: