2017-07-18 16 views
0

vw_projectは20のCTEを必要とする図であり、それらを複数回参加し、56列SQL Serverクエリの動作

を返すこれらのCTEの多くは、自己結合(古典的な「グループごとの最後の行」、我々の場合は、私たちであります

関連するテーブルの大部分(多分40本)は1000行を超えず、ビュー自体は634行を返します。

このビューの非常に悪いパフォーマンスを改善しようとしています。 非正規化(TPTからTPHに移行)し、ほとんど影響を与えずに結合の数を半分に減らしました。

しかし、私は取得しています以下の結果を理解していません:sp_updatestats https://www.brentozar.com/pastetheplan/?id=H1Cuwsor-

https://www.brentozar.com/pastetheplan/?id=r1DqRciBW

実行計画:

select * from vw_Project (TPT) 
2 sec 

select * from vw_Project (TPH) 
2 sec 

select Id from vw_Project (TPH , TPT is instant) 
6 sec 

select 1 from vw_Project (TPH , TPT is instant) 
6 sec 

select count(1) from vw_Project (TPH , TPT is instant) 
6 sec 

最後の1(6秒)の実行計画を

私にとって、それは不合理で、私は何が起こっているのか理解していないし、自分の最適化戦略が関連しているかどうかはわからない私が観察しているように見える奇妙な行動を正当化するもの...

手がかりはありますか?

+2

私たちと共有できる実行計画はありますか? – WJS

+2

誰もが見ることができるように、それらの選択肢の1つ(例えば6秒のもの)[ここ](https://www.brentozar.com/pastetheplan/)のプランを試して貼り付けることができます。 –

+0

TPTとTPHとは何ですか? –

答えて

1

CTEはステートメントを実行する保証がありません.20のCTEは私の意見では非常に多くあります。 OPTION(FORCE ORDER)を使用すると、強制的に上から下に実行できます。

しかし、数千の行を選択するには、複雑さにかかわらず1秒を超えるものは受け入れられません。私はテーブル関数のアプローチを選択するので、ハッシュテーブルやテーブル変数を作成して各ステップを完全に制御できるようになりました。このようにして、各ステップ内でオプティマイザのスコープを制限します。

+0

OPTION(FORCE ORDER)リテラルの反転結果(6は2になり、2は6になります) – Proviste

+0

面白い。 FORCE ORDERは単独では機能しません - WITH A、B、CのようなCTEの論理的な順序が必要です.BはAを使用し、CはBを使用します。上位のCTEがデータをうまくフィルタリングする場合、CTEを低くするほどデータが少なくて済みます。そのため、注文を変更しようとします。できるだけ上位のCTEを配置してください。 –