Индекс для SQL оптимизации запросов - PullRequest
0 голосов
/ 02 мая 2020

Моя задача - создать такие индексы, которые будут оптимизировать данный 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 Структура таблицы фильмов:

dvdrental database film table structure

Содержит 1000 строк, столбец rental_rate содержит значения с плавающей точкой только с 3 различными значениями: 0,99, 2,99 , 4.99.

1 Ответ

0 голосов
/ 04 мая 2020

У вас есть 1000 вложенных запросов для avg - для каждой записи в таблице (вы можете видеть как loops=1000 в плане).

Извлечение этих запросов в CTE и дальнейшее объединение увеличит скорость вашего запроса :

WITH avg_rates as (SELECT AVG(f.rental_rate) avg, f.release_year
                   FROM film f GROUP BY f.release_year)
SELECT title, f.release_year FROM film f
JOIN avg_rates a on a.release_year = f.release_year
WHERE f.rental_rate > a.avg 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...