2015-02-11 2 views
0

Я знаю, что мой запрос ниже только что попало, и это занимает 2 минуты, чтобы получить 10 записей (список таблица имеет более 1M записей, хотя), но я не уверен, Что лучший способ, чтобы написать этуInner присоединиться отчетливый медленно

Я просто хотим просто получить все страны, которые имеют списки таблицы, которая соединяет страны перечислений области ..

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 
+0

ли включать имя базы данных и версии. –

+0

Также вам нужно включить 'EXPLAIN' для запроса, количество строк без DISTINCT было бы минимальным, если вы укажете в заголовке, что отличительная черта является проблемой. –

+1

Удалите отдельные, выберите только dbo.Countries и переместите остальные в EXISTS. – jarlh

ответ

2

Предполагая, что у вас есть соответствующие индексы на месте, использование 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 
) 
+0

Это сработало отлично, отметит ответ через 8 минут, когда это позволит мне. – Zoinky

0

ли таблица списка индексный? Если у него есть 1M записи, было бы неплохо сначала проиндексировать его и проверить производительность после этого. Ваш запрос не такой сложный

0

Выполнение запроса также зависит от индексов, которые существуют в вас среде и колонки, которую вы используете.

Попробуйте это ...

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 
+0

Почему и DISTINCT, и GROUP BY? – jarlh

+0

@jarlh Не изменял эту часть старого кода при повторном использовании. Спасибо – SoulTrain

+0

Ваш прием! (Не думайте, что это важно, нужно оптимизировать, но это выглядит лучше!) – jarlh

0

Без добавления индексации или другой настройки производительности этот запрос должен работать быстрее:

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 
    ) 
Смежные вопросы