Моя задача - создать такие индексы, которые будут оптимизировать данный SQL запрос для базы данных dvdrental, не касаясь самого запроса:
EXPLAIN ANALYZE
SELECT title, release_year FROM film f1
WHERE f1.rental_rate > (
SELECT AVG(f2.rental_rate) FROM film f2
WHERE f1.release_year = f2.release_year
);
Вывод:
Seq Scan on film f1 (cost=0.00..69079.00 rows=333 width=19) (actual time=5.272..164.779 rows=659 loops=1)
Filter: (rental_rate > (SubPlan 1))
Rows Removed by Filter: 341
SubPlan 1
-> Aggregate (cost=69.00..69.01 rows=1 width=32) (actual time=0.164..0.164 rows=1 loops=1000)
-> Seq Scan on film f2 (cost=0.00..66.50 rows=1000 width=6) (actual time=0.000..0.083 rows=1000 loops=1000)
Filter: ((f1.release_year)::integer = (release_year)::integer)
Planning Time: 2.987 ms
Execution Time: 164.865 ms
Из того, что я вижу, единственное, что мы можем оптимизировать, - это последовательное сканирование на пленке f1, потому что подплан 1 содержит агрегат. Я перепробовал множество индексов в столбце rental_rate
, но ни один из них не принес никаких улучшений. Если я укажу set enable_seqscan = off;
, производительность будет только хуже. Может быть, я что-то здесь упускаю, но как это можно оптимизировать с помощью индексов? PS Структура таблицы фильмов:
Содержит 1000 строк, столбец rental_rate
содержит значения с плавающей точкой только с 3 различными значениями: 0,99, 2,99 , 4.99.