複数のCTEではかなり複雑なクエリがありますが、1つのメインCTEは他のすべてのものから取り除かれますが、これによってメインCTEが複数回実行されますか?複数のCTEを同じクエリで複数回呼び出す
5
A
答えて
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
を実行する場合は、実際の実行計画は、私は少しのためにググ
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?
関連する問題
- 1. py.testで同じフィクスチャを複数回呼び出す
- 2. PostgreSQL:同じ関数を1回のクエリで複数回呼び出す最も良い方法は?
- 3. 配列の異なる部分で同じメソッドを複数回呼び出す
- 4. Gradle buildConfigを複数回呼び出す
- 5. コンストラクターを呼び出す複数回
- 6. deleteRowsAtIndexPathsを複数回呼び出す
- 7. 複数の呼び出しで同じ値を返すHibernateストアドプロシージャ
- 8. 同じメソッド名で複数のdllインポートを呼び出す
- 9. PHPは同じ関数で複数回同じクエリを実行します。
- 10. 同じページでYUI.addを同じモジュールに対して複数回呼び出すことは安全ですか?
- 11. js関数をワンクリックで複数回呼び出す
- 12. 同じWebサービスブロッキングへの複数の呼び出し?
- 13. ソケットリスナー複数同時AcceptAsync呼び出し
- 14. セロリ - 同じパラメータ、複数の呼び出し
- 15. 複数のテキストボックスデータをターゲットテキストボックスにコピーする同じ関数を呼び出す
- 16. JQuery setTimeoutは常に関数を複数回呼び出す
- 17. 同じ引数を持つ同じメソッドへの複数の呼び出しでMockitoを使用する
- 18. 単一クエリ内の複数のCTE
- 19. AngularJSリピートセクションで複数回呼び出される関数
- 20. 同じUDFへの複数の呼び出しが1つのステートメント内にある場合、呼び出される回数は何回ですか?
- 21. DISTINCT - mysqlクエリは同じフィールドを複数回返します
- 22. Jquery関数が複数回呼び出す
- 23. 1回の呼び出しで複数のSQL文を実行
- 24. tomcatに同じアプリケーションを複数回デプロイ
- 25. 同じフォームを複数回開く
- 26. Rails 3ジェネレータでタスクを複数回呼び出す
- 27. ストアドプロシージャをプリペアドステートメントで複数回呼び出す
- 28. textFieldShouldBeginEditing:UITableViewCellのUITextFieldで複数回呼び出されています
- 29. 同じAjax呼び出しで複数のURLが可能ですか?
- 30. 同じ行のクラスメソッドを複数回呼び出すにはどうすればいいですか?
おかげだろうが、何も決定的見つけることができませんでした、私は私の推測しますそれは糖蜜として遅いので、これに一時テーブルを使用する必要があります。 – Preston
@Preston、一時テーブルを使用する前に、クエリの実行計画を見て、インデックス戦略がクエリのパフォーマンスを向上させるかどうかを判断することをお勧めします。 – zedfoxus
@zfus残念ながら、それは私のデータベースではなく、彼らは私のクエリをストアドプロシージャに入れても気にしませんが、私のために他の変更を加えることはありません。 – Preston