動的なデータセットでテーブルを結合する

私のクエリでは、既存のテーブルとデータの動的セット(パラメータに基づいて取得)を結合したいと思います。私はこのシナリオを完了するための最良の選択肢が何であるかを研究していましたが、3つの選択肢に絞って終了しました。

ビュー、CTE、関数、CTE +関数

クエリは次のようになります

select id from table
where id not in (select id from dynamic_set (param1, param2) )
  • ビューでは、すべてのデータをフィルタリングせずにプルする必要があります。
  • テーブルの各行に対して関数を実行する必要があるため、クエリのパフォーマンスに影響する可能性があります。
  • CTEと関数の組み合わせは、関数自体を使用する場合とほとんど同じですが、ローのみをフィルタリングし、パフォーマンスを少し上げるために最適化することができます。
  • CTEはsimularからtempへのテーブルなので、私の質問はデータの大量のパフォーマンスに影響します。

私は可能な限り最良の解決策についてあなたの意見を聞きたい

参加してくれてありがとう

3
@AdrianIftode:「すべてのデータをプルする」とは、元のテーブルと見直して結合するために、すべての高度なロジックをメインクエリ内で再作成する必要があるということです。私はオブジェクト指向の解決策を探していましたが、そのような解決策ではありません。
追加された 著者 mko,
@AdrianIftode:このトピックに参加する際の実際のポイントはわかりません。なぜなら、ソリューションに対するコメントが1つもないからです。 SQLはOODBMSではないことを十分に認識していますが、私は再利用可能なソリューションを指していました。今クリア?
追加された 著者 mko,
「見ることで、私はそれをフィルタリングすることができなくても、すべてのデータを引き出す必要があります。ビューにクラスタード・インデックスがない限り、これはfalseです。
追加された 著者 Adrian Iftode,
「CTEはsimularからtempへのテーブルです」これも誤っています。
追加された 著者 Adrian Iftode,
TSQLはオブジェクト指向ではありません。
追加された 著者 Adrian Iftode,
私はあなたが持っている再利用可能な解決策に答えました。実際にはそれらのすべてが再利用可能です。ビューは他のクエリで再利用可能であり、単一のクエリ定義でCTEが再利用可能であり、関数も再利用可能ですが、パフォーマンスが低下する可能性があります。本当に、私はあなたと議論したくない、それは私の意図ではない。
追加された 著者 Adrian Iftode,

1 答え

ビューがすべてのデータを取得するわけではありません。別のクエリで使用できる名前付きクエリのようなものです。ビューがフィルタリングされると、そのビューに定義されたクエリにそのフィルタが追加されます。

CTEクエリはローカルビューによく似ていますが、定義されている場所でのみ参照できます(after; with)。また、これは具体化されておらず、(クラスタ化されたインデックスを追加することによって)ビューで行うことができるように、私はCTEクエリを実現する方法を知らない。

関数は最悪のオプションです、あなたはそれをなぜ言ったのですか? 「インライン」クエリがここでのみ使用される場合は、CTEの方法を選択します。

2
追加された
SQL Serverは Oracleのスカラー・サブクエリ・キャッシング?それは関数を使うためにも考慮する必要があります。ほとんどの関数では、関数はオプティマイザによってSQLのように強力に変換できないので、あなたは正しいでしょう
追加された 著者 Lukas Eder,
私はこれについて知りません。
追加された 著者 Adrian Iftode,