Перепишите следующий запрос SQL, чтобы сделать его более эффективным / улучшить его выполнение, и причины этого - PullRequest
0 голосов
/ 13 мая 2019

Реляционная схема:

City(cityID, nameCity, nbInhabitants)
Company(companyID, companyName, nbEmployees, cityID) cityID: FK(City)

С учетом следующей статистики: • Город содержит 4 000 кортежей с 20 кортежами на странице • Компания содержит 200 000 кортежей с 15 кортежами на странице

Теперь переписатьследующий запрос для улучшения его выполнения и причины этих преимуществ:

SELECT DISTINCT companyID
FROM City NATURAL JOIN Company
WHERE nbEmployees >= 5000
AND nameCity = 'Lisboa'

Большое вам спасибо

1 Ответ

0 голосов
/ 13 мая 2019

Во-первых, я не думаю, что select distinct необходим. Почему companyId дублируется в таблице company? Кроме того, я ожидаю, что join принесет только один город.

Избегайте natural join. Это просто ждущие ошибки. Вы не знаете, какие ключи объединения используются, и он даже не использует должным образом объявленные отношения внешних ключей.

Позвольте мне предположить, что это ваш запрос:

select c.CompanyId
from Company c join
     City ci
     on c.cityId = ci.cityId
where c.nbEmployees >= 5000 and ci.nameCity = 'Lisboa';

У вас есть два подхода к оптимизации. Сначала я бы предложил индексы на Company(nbEmployees, cityId) и City(cityId, 'Lisboa').

Если у вас много компаний с более чем 5000 сотрудников и очень мало в Лиссабоне, тогда альтернативная стратегия индексации - city(nameCity, cityId), company(cityId, nbEmployees, companyId).

...