0

У меня проблема с выбором из таблицы. Я бегу следующий запрос:Выбирать с помощью группы занимает длительное время

DECLARE @FactId nvarchar (MAX) 

set @FactId = '2379233,2379237,2379244,2379246,2379249,2379250,2379254,2379255,2379257,2379260,2379262,2379264,2379266,2379268,2379270,2379276,2379279,2379284,2379285,2379293,2379294,2379298,2379300,2379305,2379308,2379310,2379313'; 

BEGIN 

SELECT 
    (apd.USS) as USS, (apd.Area) as Area, P.[Description] 
FROM 
    [gisoo].AdministrationPileDetail apd 
INNER JOIN 
    [gisoo].Locality L on L.LocalityId = apd.LocalityId 
INNER JOIN 
    [gisoo].Province P on P.CountryId = L.CountryId AND P.Provinceid = L.ProvinceId 
WHERE 
    apd.FactId IN (SELECT * FROM [gisoo].[ItemListToTable](@FactId)) 
    AND L.ProvinceId IS NOT NULL 
    AND L.DepartmentId IS NOT NULL 
END 
GO 

Этот выбор делит nvarchar (@FactId) в таблицу со всеми отделенной ID:

SELECT * 
FROM [gisoo].[ItemListToTable](@FactId) 

Запрос имеет 12000 строк, и это занимает две секунды, но когда я запускаю группу, она занимает 40 секунд.

DECLARE @FactId nvarchar (MAX) 

set @FactId = '2379233,2379237,2379244,2379246,2379249,2379250,2379254,2379255,2379257,2379260,2379262,2379264,2379266,2379268,2379270,2379276,2379279,2379284,2379285,2379293,2379294,2379298,2379300,2379305,2379308,2379310,2379313'; 

BEGIN 

SELECT 
    SUM(apd.USS) AS USS, 
    SUM(apd.Area) AS Area, 
    P.[Description] 
FROM 
    [gisoo].AdministrationPileDetail apd 
INNER JOIN 
    [gisoo].Locality L ON L.LocalityId = apd.LocalityId 
INNER JOIN 
    [gisoo].Province P ON P.CountryId = L.CountryId AND P.Provinceid = L.ProvinceId 
WHERE 
    apd.FactId IN (SELECT * FROM [gisoo].[ItemListToTable](@FactId)) 
    AND L.ProvinceId IS NOT NULL 
    AND L.DepartmentId IS NOT NULL 
GROUP BY 
    P.[Description] 
END 
GO 

Обе таблицы не имеют индексов.

Я использую SQL Server 2008 R2 и запрос Она также была протестирована в SQL Server 2012.

+0

Какой тип колонка описания? Вы выполнили план запроса? Вы пытались индексировать столбец описания? – Juan

+0

описание char (30) null. Я проверяю план и говорю, что я могу оптимизировать только 30% с помощью индекса. Остается много времени на мой запрос. провинция стола, где описание данных извлечения имеет только 71 строку. –

+0

Наконец, заполните группу приложением, ответ был всего 3 секунды. Я не нашел свою проблему в SQL-запросе –

ответ

0

Попробуйте
и заменить SELECT * FROM с определенным именем столбца

set @FactId = '2379233,2379237,2379244,2379246,2379249,2379250,2379254,2379255,2379257,2379260,2379262,2379264,2379266,2379268,2379270,2379276,2379279,2379284,2379285,2379293,2379294,2379298,2379300,2379305,2379308,2379310,2379313'; 

BEGIN 

SELECT SUM(apd.USS) AS USS, 
     SUM(apd.Area) AS Area, 
     P.[Description] 
    FROM [gisoo].AdministrationPileDetail apd 
    JOIN [gisoo].Locality L 
     ON L.LocalityId = apd.LocalityId 
     AND L.DepartmentId IS NOT NULL 
     AND apd.FactId IN (SELECT * FROM [gisoo].[ItemListToTable] (@FactId))   
    JOIN [gisoo].Province P 
     ON P.CountryId = L.CountryId 
     AND P.Provinceid = L.ProvinceId   
GROUP BY P.[Description] 
END 
GO 
+0

Консультация по-прежнему выполняется в то же время выберите все, потому что таблица имеет только один столбец. –

+0

По-прежнему полезно использовать имя столбца. И были другие изменения в запросе. Попробуйте указатель на P. [Description] или еще лучше PK на этой таблице, если описание уникально. – Paparazzi

+0

Понизьте мнение по уходу за комментариями? Пойдем, в чем проблема? – Paparazzi

0

Для ваш запрос вы должны индексировать следующее:

CREATE INDEX IX_AdministrationPileDetail_LocalityId ON AdministrationPileDetail (LocalityID) 
CREATE INDEX IX_AdministrationPileDetail_FactId ON AdministrationPileDetail (FactId) 

CREATE INDEX IX_Locality_CountryId ON Locality(CountryId) 
CREATE INDEX IX_Locality_ProvinceId ON Locality(ProvinceId) 
CREATE INDEX IX_Locality_DepartmentId ON Locality(DepartmentId) 

Это основная индексация в вашем FK, что лучше практика, чтобы сделать ,

Тогда, если у вас возникли проблемы, вы можете рассмотреть, чтобы создать индекс в столбце группируются по:

CREATE INDEX IX_Province_Description ON Province(Description) 

Вы можете переместить функцию снаружи и создать временную таблицу для этого, вместо того, чтобы призывая его к ГДЕ.

SELECT 
    * 
INTO 
    #Items 
FROM 
    [gisoo].[ItemListToTable](@FactId) 

CREATE IX_Items_FactId ON #Items(FactId) 

SELECT 
    (apd.USS) as USS, (apd.Area) as Area, P.[Description] 
FROM 
    [gisoo].AdministrationPileDetail apd 
INNER JOIN 
    [gisoo].Locality L on L.LocalityId = apd.LocalityId 
INNER JOIN 
    [gisoo].Province P on P.CountryId = L.CountryId AND P.Provinceid = L.ProvinceId 
INNER JOIN 
    #Items i ON apd.FactId = i.FactId 
WHERE 
    apd.FactId IN (SELECT * FROM [gisoo].[ItemListToTable](@FactId)) 
    AND L.ProvinceId IS NOT NULL 
    AND L.DepartmentId IS NOT NULL