SQL Select Top с предложением Left Join и Where - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть две таблицы базы данных:

Города со столбцами:

Country_Code | City_Code | City_Name  

Страны со столбцами

Country_Code | Country_Name

На основе нескольких символов, введенных пользователем, он проверяет столбец City_Name, чтобы возвращать результаты для заполнения поля автозаполнения City.У результата должны быть код города, название города, код страны и название страны, поэтому необходимо объединение.

Я использую запрос

 SELECT TOP 10 
     ci.Country_Code, ci.City_Code, ci.City_Name, co.Country_Name  
 FROM 
     Cities ci 
 LEFT OUTER JOIN 
     Countries co ON ci.Country_Code = co.Country_Code  
 WHERE 
     ci.City_Name LIKE '@CityName'  
 ORDER BY 
     ci.City_Name  

Результаты Iget верны, но выполнение запроса занимает много времени.Из того, что я понимаю, сначала результаты содержат объединение обеих таблиц, затем включается предложение where, чтобы получить только конкретные строки, упорядоченные по названию города и возвращенные 10 лучших результатов.

У меня вопрос, есть ли способ ускорить запрос.Проверено ли условие where, а затем выполняется только объединение, лучше выполнить его только для 10 лучших результатов?Я пытался вставить свое предложение WHERE в предложение ON, но это дало неправильные результаты.


РЕДАКТИРОВАТЬ: @CityName содержит 2-3 символа, введенных пользователем, а затем "%".

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Похоже, это ваш запрос:

SELECT TOP 10 ci.Country_Code, ci.City_Code, ci.City_Name, co.Country_Name  
FROM Cities ci LEFT OUTER JOIN 
     Countries co
     ON ci.Country_Code = co.Country_Code  
WHERE ci.City_Name LIKE @CityName  
ORDER BY ci.City_Name  ;

Кавычки не должны быть нужны около @CityName.

Я не понимаю LEFT JOIN.Это говорит о том, что есть города без действительного Country_Code - и это кажется маловероятным.

Если предположить, что @CityName не начинается с символа подстановки (как предполагает ваш вопрос), тоэто может использовать индекс.Я бы предложил следующие индексы:

  • cities(city_name, country_code)
  • countries(country_code, country_name)

Второй не нужен, если country_code является первичным ключом.

0 голосов
/ 03 февраля 2019

Я бы предложил начать с добавления кластеризованного индекса к Countries.Country_Code (а также сделать его первичным ключом таблицы стран, если это не так).Индекс сортирует таблицу так, что скорость поиска в соединении увеличивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...