2013-08-07 41 views

答えて

2

を見てみましょう。

例:あなたはAdventureWorks2008R2データベースを使用して、このクエリ

SELECT h.ProductID,h.StandardCost, 
     x.AvgPrice 
FROM Production.ProductCostHistory h 
CROSS JOIN (
    SELECT AVG(p.ListPrice) AvgPrice 
    FROM Production.Product p 
) x 

を実行する場合は、実際の実行計画は、私は少しのためにググ enter image description here

1

以下
DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50), 
     TypeID INT 
) 

DECLARE @TableTypes TABLE(
     TypeID INT, 
     TypeName VARCHAR(50) 
) 

;WITh Vals AS (
     SELECT * 
     FROm @Table 
     WHERE ID > 10 
) 
, UsingVals1 AS (
     SELECT v.*, 
       tt.TypeName 
     FROm Vals v INNER JOIN 
       @TableTypes tt ON v.TypeID = tt.TypeID 
) 
, UsingVals2 AS (
     SELECT v.*, 
       tt.TypeName 
     FROm Vals v INNER JOIN 
       @TableTypes tt ON v.TypeID = tt.TypeID 
     WHERE tt.TypeName LIKE '%%' 
) 
SELECT * 
FROM UsingVals1 
UNION 
SELECT * 
FROM UsingVals2 

を見てください。そして、このSQL Fiddle DEMO

であなたはヴァルスCTEセクションが2回実行される実行計画からわかります。

SELECT 
    AVG(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterAverage, 
    STDEVP(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterSTDeviation, 
    AVG(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterAverage, 
    STDEVP(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterSTDeviation, 
    AVG(CASE WHEN [email protected] AND Q.year = @year AND semester = @semester THEN score END) ClassScore, 
    STDEVP(CASE WHEN [email protected] AND Q.year = @year AND semester = @semester THEN score END) ClassSTDeviation, 
    (SELECT DecTile FROM cteNtile WHERE instructorID = @instructorID)*10 DecTile, 
    X.DepartmentClassFiveYearAverage AS DepartmentClassFiveYearAverage, 
    X.DepartmentClassFiveYearSTDeviation AS DepartmentClassFiveYearSTDeviation, 
    X.InstructorClassFiveYearAverage AS InstructorClassFiveYearAverage, 
    X.InstructorClassFiveYearSTDeviation AS InstructorClassFiveYearSTDeviation 
FROM 
    cteMain Q CROSS JOIN cteFiveYear X 

これは、複数の実行を防ぐことができます(実際の実行計画のNumber of Executionsプロパティを参照)cteFiveYearについて:

はたぶんもあなたがCROSSは、このようにJOINを使用することができHow many times the T-SQL inside the CTE is executed?

+0

おかげだろうが、何も決定的見つけることができませんでした、私は私の推測しますそれは糖蜜として遅いので、これに一時テーブルを使用する必要があります。 – Preston

+2

@Preston、一時テーブルを使用する前に、クエリの実行計画を見て、インデックス戦略がクエリのパフォーマンスを向上させるかどうかを判断することをお勧めします。 – zedfoxus

+0

@zfus残念ながら、それは私のデータベースではなく、彼らは私のクエリをストアドプロシージャに入れても気にしませんが、私のために他の変更を加えることはありません。 – Preston

関連する問題