Как уменьшить время на стене по приведенному ниже запросу? - PullRequest
0 голосов
/ 17 апреля 2020

(125, 3) Время стены: 18 минут 18 секунд

    SELECT Movie.year AS Year, COUNT(*) AS NOM ,Movie.Title
    FROM MOVIE JOIN M_Cast ON TRIM(M_Cast.mid) = TRIM(Movie.mid) JOIN 
    Person ON TRIM(Person.pid) = TRIM(M_Cast.pid)
    WHERE Person.Gender = 'Female'
    GROUP BY Movie.year
    ORDER BY NOM DESC 

Для каждого года подсчитайте количество фильмов в этом году, в которых были только женщины-актеры

1 Ответ

2 голосов
/ 17 апреля 2020

Использование вами trim() запрещает использование индексов. Вам никогда не нужно это для соединений между таблицами. Итак:

SELECT m.year AS Year, COUNT(*) AS NOM , m.Title
FROM MOVIE m JOIN
     M_Cast c
     ON c.mid = m.mid JOIN 
     Person p
     ON p.pid = c.pid
WHERE p.Gender = 'Female'
GROUP BY m.year
ORDER BY NOM DESC ;

В правильно структурированной базе данных идентификаторы в MOVIE и PERSON должны быть первичными ключами. Если это не так, вы должны это исправить.

Вам также нужен индекс для M_CAST(mid, pid) или M_CAST(pid, mid).

Если ваши первичные ключи являются строками, вы должны исправить эти значения так TRIM() НИКОГДА не нужно:

update movie
    set mid = trim(mid);
...