如何在使用多个连接时优化SELECT DISTINCT?

时间:2015-11-06 14:26:57

标签: tsql optimization distinct

我已经读过使用cte,你可以加速选择最多100次。 Link to the website。他们有以下例子:

USE     tempdb;
GO
DROP    TABLE dbo.Test;
GO
CREATE  TABLE 
    dbo.Test 
    (
    data            INTEGER NOT NULL,
    );
GO
CREATE  CLUSTERED INDEX c ON dbo.Test (data);
GO
-- Lots of duplicated values
INSERT  dbo.Test WITH (TABLOCK)
    (data)
SELECT  TOP (5000000)
    ROW_NUMBER() OVER (ORDER BY (SELECT 0)) / 117329
FROM    master.sys.columns C1,
    master.sys.columns C2,
    master.sys.columns C3;
 GO

WITH    RecursiveCTE
AS      (
    SELECT  data = MIN(T.data)
    FROM    dbo.Test T
    UNION   ALL
    SELECT  R.data
    FROM    (
            -- A cunning way to use TOP in the recursive part of a CTE :)
            SELECT  T.data,
                    rn = ROW_NUMBER() OVER (ORDER BY T.data)
            FROM    dbo.Test T
            JOIN    RecursiveCTE R
                    ON  R.data < T.data
            ) R
    WHERE   R.rn = 1
    )
SELECT  *
FROM    RecursiveCTE
OPTION  (MAXRECURSION 0);

如何将此应用于具有多个连接的查询?例如,我正在尝试运行下面的查询,但是大约需要两分半钟。我将如何相应地优化它?

SELECT DISTINCT x.code
From         jpa 
INNER JOIN   jp  ON jpa.ID=jp.ID 
INNER JOIN   jd  ON (jd.ID=jp.ID And jd.JID=3)
INNER JOIN  l ON  jpa.ID=l.ID AND l.CID=3
INNER JOIN   fa  ON fa.ID=jpa.ID
INNER JOIN x ON fa.ID=x.ID

1 个答案:

答案 0 :(得分:1)

1)每列的GROUP BY对我来说工作得更快。

2)如果某些表中有重复项,那么您也可以预先选择并作为内部查询从中加入。

3)如果您希望此连接将限制数据,通常可以嵌套连接。 SQL join format - nested inner joins