sql >> データベース >  >> RDS >> Sqlserver

使用 vs 一時テーブルの宣言:パフォーマンス/違い?

    @table 構文は、テーブル変数 (tempdb 内の実際のテーブル) を作成します ) に結果を具体化します。

    WITH 構文は、共通テーブル式 を定義します これは具体化されておらず、単なるインライン ビューです。

    ほとんどの場合、2 番目のオプションを使用したほうがよいでしょう。これは関数内にあると述べています。これが TVF の場合、ほとんどの場合、これらを複数ステートメントではなくインラインにして、オプティマイザーによって展開できるようにする必要があります。これにより、テーブル変数の使用が即座に禁止されます。

    ただし、場合によっては (基になるクエリが高価で、複数回実行されるのを避けたい場合など)、特定のケースで中間結果を具体化するとパフォーマンスが向上すると判断する場合があります。 現時点ではありません CTE に対してこれを強制する (少なくともプラン ガイドを強制することなく )

    その場合、(一般に) 3 つのオプションがあります。 @tablevariable#localtemp テーブルと ##globaltemp テーブル。ただし、関数内での使用が許可されるのは、これらの最初のものだけです。

    テーブル変数と #temp テーブルの違いに関する詳細については、こちらをご覧ください .



    1. MySQLデータベースからのBLOBイメージの読み取り

    2. SQLがwhere句の列エイリアスを認識しない

    3. null値を持つ行データからMIN値を選択するSQL

    4. Oracle8iでオプションのOUTERJOIN条件を指定する方法