内部连接明显慢

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
    )