2

複数の CTE を使用する複雑なプロセスを作成しました (主に再帰的な階層作業用)。
データの小さなサンプル セットではすべてが期待どおりに進みますが、コードを大きなデータ セットに適用すると、予期しない (そして間違った) 結果を受け取りました。

私はそれをCTEに絞り込んだと思います。再帰的な CTE は、以前のいくつかの CTE で処理された "供給された" データであり、それが問題のようです。

次のようにサンプルデータセットを設定しました。

  • 一意のデータを含む 4 つの行
  • 各行はランダムな行番号を受け取ります (これは CTE で追加されます)

次に、最初の CTE の結果を取得し、2 番目の CTE で自己結合を実行します。
すべての行が結合し、それぞれが結合することを期待していました。実際に起こることは、等しくない行が結合することです。

誰かがこの行動の説明を提供できますか?

4

1 に答える 1

9

あなたがそれを理解していない場合を除いて、その結果について予期しないことは何もありません。

各 CTE は解決されeach and every time、参照されます。はい、これが、非常にトランザクションの多いテーブルの単純な CTE が、1 つの参照で 4 行を返し、次の 2 レベル下で 5 行を返す可能性がある理由です。

ただし、サンプルでは、​​ORDER BY NEWID() が原因で、元の CTE の各解像度に異なる row_number()-ing を与えます。CTE はメモリに保存され、キャッシュされると思いましたか? SQLFiddle サイトの結果の下に、「実行計画の表示」リンクがあります。これは、テーブルの 2 つの別個の別々のスキャンを示しています。

于 2012-10-15T08:17:42.000 に答える