Улучшения производительности запросов - фильтры сортировки
Как можно повысить производительность этого запроса:
SELECT designs.* FROM designs
WHERE designs.state = 'in_stock'
ORDER BY designs.grade, id DESC
Объясните вывод:
Sort (cost=47475.35..47591.91 rows=46621 width=763)
Sort Key: grade, id
-> Seq Scan on designs (cost=0.00..12304.20 rows=46621 width=763)
Filter: ((state)::text = 'in_stock'::text)
В таблице более 250000 записей.
Создание индекса на state
не очень помогает
2 ответа
1) Назовите столбцы вместо *, такие как Select col1, col2.... Вам нужны все столбцы в результирующем наборе? Если не показывать только те столбцы, которые вам нужны.
2) Какие столбцы вы указали? Попробуйте индексировать по штату и включите оценку и ID.
3) Можно ли заменить state = 'in_stock ' чем-то, что фильтрует по целочисленному значению и дает тот же результат? Может ли само поле состояния быть преобразовано в тип int и проиндексировано, а затем создать таблицу поиска для этих целочисленных значений?
Чтобы оптимизировать данный запрос (что может быть не самой лучшей стратегией в целом), используйте частичный индекс с соответствующим порядком сортировки:
CREATE INDEX foo_idx ON designs (grade, id DESC) WHERE state = 'in_stock';
На самом деле я хотел бы начать с вашей таблицы, глядя на тип данных state
первый.
Тогда я бы спросил, какие столбцы и строки вам действительно нужно вернуть из вашего запроса. Я сомневаюсь, что вам нужны все столбцы всех 46621 строк в результате для отображения?