複数の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. 同じように呼び出す<script>複数回
- 3. Javascript別のパラメータで同じ関数を複数回呼び出す
- 4. PostgreSQL:同じ関数を1回のクエリで複数回呼び出す最も良い方法は?
- 5. 関数を呼び出す複数回
- 6. 同じテーブルを複数回クエリする
- 7. 複数のAJAXを同じ関数を呼び出して呼び出す
- 8. C++:複数のクラスの同じ関数を呼び出す
- 9. 単一のトランザクションのスコープ内で同じADO.NETコマンドを複数回呼び出す
- 10. 複数の関数呼び出しは、同じ入力引数
- 11. 配列の異なる部分で同じメソッドを複数回呼び出す
- 12. Jenkins:ポストビルドアクションを同じジョブの中で複数回呼び出す方法は?
- 13. 同じphpページで同じ関数を2回呼び出す
- 14. コンストラクターを呼び出す複数回
- 15. mallocを複数回呼び出す
- 16. angular2ルートガードを複数回呼び出す
- 17. deleteRowsAtIndexPathsを複数回呼び出す
- 18. Gradle buildConfigを複数回呼び出す
- 19. BeforeShowDayを複数回呼び出す
- 20. google.script.run.withSuccessHandlerを複数回呼び出す
- 21. ReactDOM.renderを複数回呼び出す
- 22. ウィンドウフォームアプリケーションで非同期メソッドを複数回呼び出す
- 23. 複数の呼び出しで同じ値を返すweb2py_uuid()?
- 24. 複数の呼び出しで同じ値を返すHibernateストアドプロシージャ
- 25. 同じメソッド名で複数のdllインポートを呼び出す
- 26. 同じアクティビティを呼び出す複数のインスタンスと複数のアクティビティ
- 27. メソッドの呼び出しが複数回
- 28. 同じDivを複数回使用してAjaxを呼び出す方法
- 29. PHPは同じ関数で複数回同じクエリを実行します。
- 30. 同じページでYUI.addを同じモジュールに対して複数回呼び出すことは安全ですか?
おかげだろうが、何も決定的見つけることができませんでした、私は私の推測しますそれは糖蜜として遅いので、これに一時テーブルを使用する必要があります。 – Preston
@Preston、一時テーブルを使用する前に、クエリの実行計画を見て、インデックス戦略がクエリのパフォーマンスを向上させるかどうかを判断することをお勧めします。 – zedfoxus
@zfus残念ながら、それは私のデータベースではなく、彼らは私のクエリをストアドプロシージャに入れても気にしませんが、私のために他の変更を加えることはありません。 – Preston