我有两个数据库表:
城市,其中包含列:
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
我得到的结果是正确的,但是查询需要很长时间才能完成。据我了解,首先,结果包含两个表的联接,然后使用where子句以仅获取特定行,这些行按城市名称排序,并返回前10个结果。
我的问题是,有没有一种方法可以加快查询速度。是否检查过where子句,然后仅执行联接,最好还是仅对前10个结果进行联接?我尝试将WHERE
子句放在ON
子句中,但是结果不正确。
编辑:@CityName包含用户输入的2-3个字符,然后是'%'。
答案 0 :(得分:0)
我建议先在Countries.Country_Code
上添加聚集索引(如果还不是,请使其成为Countrys表的主键)。索引将对表进行排序,从而提高联接中的搜索速度。
答案 1 :(得分:0)
这似乎是您的查询:
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
是主键,则不需要第二个。