内部连接明显慢
Inner join with distinct slow
我知道下面的查询很糟糕,需要 2 分钟才能获得 10 条记录(虽然列表 table 有超过 100 万条记录)但我不确定写这个的更好方法是什么
我只想获取所有列出的国家/地区 table 将国家/地区与列表联系起来的省份..
ALTER VIEW [dbo].[CountriesWithListings]
AS
SELECT distinct
cn.CountryID,
cn.Code as CountryCode,
cn.Name as CountryName
FROM dbo.Countries AS cn
INNER JOIN dbo.Provinces AS p ON p.CountryID = cn.CountryID
INNER JOIN dbo.Cities c on c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE l.IsActive = 1 AND l.IsApproved = 1
列表 table 是否已编入索引?如果它有 100 万个条目,最好先对其进行索引,然后再检查性能。你的查询没那么复杂
假设您有适当的索引,使用 distinct
是昂贵的。您应该能够使用 exists
:
获得更好的性能
SELECT
cn.CountryID,
cn.Code as CountryCode,
cn.Name as CountryName
FROM dbo.Countries AS cn
WHERE EXISTS (
SELECT 1
FROM dbo.Provinces AS p
INNER JOIN dbo.Cities c on c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE p.CountryID = cn.CountryID
AND l.IsActive = 1
AND l.IsApproved = 1
)
查询的性能还取决于您环境中存在的索引和您使用的列。
试试这个...
SELECT cn.CountryID
,MIN(cn.Code) AS CountryCode
,MIN(cn.NAME) AS CountryName
FROM dbo.Countries AS cn
INNER JOIN dbo.Provinces AS p ON p.CountryID = cn.CountryID
INNER JOIN dbo.Cities c ON c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE l.IsActive = 1
AND l.IsApproved = 1
GROUP BY cn.CountryID
如果不添加索引或其他性能调整,此查询应该 运行 更快:
ALTER VIEW [dbo].[CountriesWithListings]
AS
SELECT cn.CountryID, cn.Code as CountryCode, cn.Name as CountryName
FROM dbo.Countries AS cn
WHERE cn.CountryID IN
(
SELECT p.CountryId FROM dbo.Provinces
INNER JOIN dbo.Cities c on c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE l.IsActive = 1 AND l.IsApproved = 1
)
我知道下面的查询很糟糕,需要 2 分钟才能获得 10 条记录(虽然列表 table 有超过 100 万条记录)但我不确定写这个的更好方法是什么
我只想获取所有列出的国家/地区 table 将国家/地区与列表联系起来的省份..
ALTER VIEW [dbo].[CountriesWithListings]
AS
SELECT distinct
cn.CountryID,
cn.Code as CountryCode,
cn.Name as CountryName
FROM dbo.Countries AS cn
INNER JOIN dbo.Provinces AS p ON p.CountryID = cn.CountryID
INNER JOIN dbo.Cities c on c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE l.IsActive = 1 AND l.IsApproved = 1
列表 table 是否已编入索引?如果它有 100 万个条目,最好先对其进行索引,然后再检查性能。你的查询没那么复杂
假设您有适当的索引,使用 distinct
是昂贵的。您应该能够使用 exists
:
SELECT
cn.CountryID,
cn.Code as CountryCode,
cn.Name as CountryName
FROM dbo.Countries AS cn
WHERE EXISTS (
SELECT 1
FROM dbo.Provinces AS p
INNER JOIN dbo.Cities c on c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE p.CountryID = cn.CountryID
AND l.IsActive = 1
AND l.IsApproved = 1
)
查询的性能还取决于您环境中存在的索引和您使用的列。
试试这个...
SELECT cn.CountryID
,MIN(cn.Code) AS CountryCode
,MIN(cn.NAME) AS CountryName
FROM dbo.Countries AS cn
INNER JOIN dbo.Provinces AS p ON p.CountryID = cn.CountryID
INNER JOIN dbo.Cities c ON c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE l.IsActive = 1
AND l.IsApproved = 1
GROUP BY cn.CountryID
如果不添加索引或其他性能调整,此查询应该 运行 更快:
ALTER VIEW [dbo].[CountriesWithListings]
AS
SELECT cn.CountryID, cn.Code as CountryCode, cn.Name as CountryName
FROM dbo.Countries AS cn
WHERE cn.CountryID IN
(
SELECT p.CountryId FROM dbo.Provinces
INNER JOIN dbo.Cities c on c.ProvinceID = p.ProvinceID
INNER JOIN dbo.Listings AS l ON l.CityID = c.CityID
WHERE l.IsActive = 1 AND l.IsApproved = 1
)