2015-11-06 50 views
-1

我讀過,使用cte的,你可以加快選擇不同達100次。 Link to the website。他們有這樣的例子:如何在使用多個連接時優化SELECT DISTINCT?

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

遞歸CTE如何適用於第二個? – Paparazzi

+0

嗯,我想知道它是否可以應用? – AC007

+0

你想申請遞歸CTE你不需要遞歸,因爲它幫助完全無關的查詢?你問「我該如何應用這個」? – Paparazzi

回答

1

1)GROUP BY對每一列的工作速度都比較快。

2)如果你在一些表中有重複,那麼你也可以預先選擇並作爲內部查詢加入。

3)通常,如果您希望此連接將限制數據,則可以嵌套連接。 SQL join format - nested inner joins

+0

我試過使用Group By,但對我來說它實際上比較慢 – AC007

+0

@ AC007:其他選項呢? – doker

+0

我剛纔只看到你的編輯,所以我會給他們一個去,現在讓你知道,謝謝你的輸入:) – AC007