[INF] よく寄せられる質問 - SQL Server 2000 - table 変数

文書翻訳 文書翻訳
文書番号: 305977 - 対象製品
すべて展開する | すべて折りたたむ

概要

この資料では、SQL Server 2000 で導入された table 変数に関してよく寄せられる質問 (FAQ) とその回答をいくつか掲載します。

table 変数に関する SQL Server Books Online の説明を参照するには、次のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/japan/msdn/library/ja/tsqlref/ts_ta-tz_7ysl.asp

詳細

Q1 : 既存の一時テーブルに加えて、table 変数が導入された理由は何ですか。

A1 : table 変数には、一時テーブルと比べて以下の利点があります。
  • SQL Server Books Online の「table」に記載されているように、table 変数には、ローカル変数と同様に有効範囲が明確に定義されており、終了時に自動的に削除されます。
  • table 変数を使用すると、ストアド プロシージャの再コンパイルの回数が、一時テーブルを使用した場合よりも少なくなります。
  • table 変数を使用するトランザクションは、table 変数に対する更新の実行中のみ有効です。したがって、table 変数を使用すると、ロックおよびログで必要なリソースが少なくて済みます。table 変数の有効範囲は限られており、持続性のあるデータベースの一部ではないため、トランザクションのロールバックによる影響を受けません。
Q2 : table 変数を使用すると、一時テーブルを使用するときよりも、ストアド プロシージャの再コンパイルの回数が少なくなるのはなぜですか。

A2 : 次の資料で、ストアド プロシージャの再コンパイルが発生する理由のいくつかについて説明しています。

243586 ストアド プロシージャの再コンパイルのトラブルシューティング
「特定の一時テーブル操作によるリコンパイル」には、一時テーブルが原因で発生する再コンパイルなどを回避するための必要条件も記載されていますが、これらの制限は table 変数には当てはまりません。

table 変数は、table 変数を作成するバッチに完全に限定されるため、CREATE ステートメントまたは ALTER ステートメントの実行時に、"再解決" が行われる必要はありません。"再解決" は、一時テーブルで行われることがあります。それは、一時テーブルでは、ネストされたストアド プロシージャからテーブルを参照できるように、この "再解決" が行われる必要があるためです。table 変数ではその必要がまったくないため、コンパイル済みのプランをストアド プロシージャで使用できます。したがって、ストアド プロシージャを処理するために必要なリソースが節約されます。

Q3 : table 変数の短所にはどういうものがありますか。

A3 : 一時テーブルと比較した場合、table 変数には以下のような短所があります。
  • table 変数で作成できるのは、PRIMARY 制約または UNIQUE 制約に作成されるシステム インデックスのみで、それ以外の非クラスタ化インデックスは作成できません。このため、非クラスタ化インデックス付きの一時テーブルと比較すると、クエリのパフォーマンスに影響を与える可能性があります。
  • table 変数では、一時テーブルで行える統計の保持が行われません。table 変数に統計を作成することは、自動作成または CREATE STATISTICS ステートメントを使用しても行えません。したがって、大きなテーブルの複雑なクエリの場合、統計がないために、オプティマイザでクエリの適切なプランが判断されなくなり、そのクエリのパフォーマンスに影響を与えることがあります。
  • 最初の DECLARE ステートメントの後で、テーブル定義を変更することはできません。
  • table 変数は、INSERT EXEC ステートメントまたは SELECT INTO ステートメントでは使用できません。
  • table 型の宣言では、CHECK 制約、DEFAULT 値、および計算される列からユーザー定義関数を呼び出すことができません。
  • EXEC ステートメントまたは sp_executesql ストアド プロシージャを使用して、table 変数を参照する動的な SQL Server クエリを実行する場合、EXEC ステートメントまたは sp_executesql ストアド プロシージャの外部で table 変数を作成すると、これらのクエリを実行することができません。table 変数を参照できるのは、ローカルの有効範囲内のみであり、EXEC ステートメントおよび sp_executesql ストアド プロシージャが table 変数の有効範囲外になるためです。ただし、table 変数を EXEC ステートメントまたは sp_executesql ストアド プロシージャ内で作成する場合は、table 変数のローカルの有効範囲が EXEC ステートメントまたは sp_executesql ストアド プロシージャ内にあるため、EXEC ステートメントまたは sp_executesql ストアド プロシージャ内ですべての処理が実行されます。
Q4 : table 変数はメモリのみを使用する構造になっていますか。一時テーブルや固定テーブルは、物理ディスクに存在するデータベースに保持されるため、メモリのみを使用する構造であれば一時テーブルや固定テーブルよりも優れたパフォーマンスが保証されると考えられます。

A4 : table 変数は、メモリのみを使用する構造ではありません。table 変数では、メモリ内には収まらないデータを保持することがあるため、データを格納できる場所がディスク上に必要です。table 変数は、一時テーブルに類似した tempdb データベースに作成されます。メモリを使用できる場合、table 変数と一時テーブルの両方がメモリ内 (データ キャッシュ) に作成されて処理されます。

Q5 : 一時テーブルではなく、table 変数を使用する必要がありますか。

A5 : 以下の 3 つの要因によって異なります。
  • テーブルに挿入されている行数
  • クエリが保存される再コンパイルの回数
  • クエリの種類、およびパフォーマンス向上のためにインデックスと統計に依存する度合い
状況によっては、一時テーブルが含まれるストアド プロシージャをより小さなストアド プロシージャに分割して、再コンパイルが、より小さな単位で実行されるようにする方法が役立つ場合があります。

一般的には、膨大な量のデータがあり、テーブルを繰り返し使用するとき以外は、可能な限り table 変数を使用します。その場合、一時テーブルにインデックスを作成すると、クエリのパフォーマンスを向上できます。ただし、状況はそれぞれ異なるため、特定のクエリやストアド プロシージャに対して、table 変数が一時テーブルよりも役立つかどうかをテストすることをお勧めします。

上記以外の質問がある場合は、次の Microsoft SQL Server ニュースグループを参照してください。Microsoft SQL Server ニュースグループ

この資料や他の Microsoft SQL Server の「サポート技術情報」 (Microsoft Knowledge Base) の資料に関するコメントは、SQLKB@Microsoft.com にお寄せください。

プロパティ

文書番号: 305977 - 最終更新日: 2006年12月11日 - リビジョン: 6.1
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 2000 Standard Edition
キーワード:?
kbfaq kbinfo KB305977
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com