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) 

您可能需要外部的移动功能,并创建一个态表了它,而不是让它在WHERE上调用。

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