3

多くのテーブルの何百万ものレコードで機能するストアドプロシージャのモンスターを高速化しようとしています。

私はこれに遭遇しました: SQL Server 2008でサブクエリとしてストアドプロシージャを使用することは可能ですか?

私の質問は、テーブル値関数を使用する方が一時テーブルを使用するよりも優れている理由です。

ストアドプロシージャ@SP1を想定します

declare @temp table(a int)


insert into @temp 
select a from BigTable 
where someRecords like 'blue%'

update AnotherBigTable
set someRecords = 'were blue'
from AnotherBigTable t 
inner join
@temp
on t.RecordID = @temp.a

上記のリンクを読んだ後、consunsusは私の@tempを一時テーブルとして使用する代わりに、その選択を行うテーブル値関数を作成しているようです。(そして、この例のような単純な選択の場合はインライン化します)しかし、実際の選択は複数であり、多くの場合単純ではありません(つまり、サブクワイアなど)。利点は何ですか?

ありがとう

4

2 に答える 2

3

通常、テーブル変数の代わりに一時テーブル(#)を使用します。テーブル変数は、実際には次の場合にのみ役立ちます

  • 一時オブジェクトを作成できない関数
  • テーブル値データ(セット)を読み取り専用パラメーターとして渡す
  • 特定のクエリエッジケースのゲーム統計
  • 実行プランの安定性(統計およびINSERT INTOテーブル変数が並列プランを使用できないという事実に関連)
  • SQL Server 2012より前では、#tempテーブルはtempdbから照合を継承しますが、@table変数は現在のデータベース照合を使用します

それ以外は、#temporaryテーブルは、変数よりも優れているとは言えないまでも機能します。

さらに読む:SQL Serverの一時テーブルとテーブル変数の違いは何ですか?

于 2012-12-06T00:55:18.993 に答える
0

おそらくもはや関連性はありません...しかし、2つの異なるアプローチを取ることを提案するかもしれません。

シンプルなアプローチ1:


テーブル値変数の主キーを試してください。

declare @temp table(a int, primary key(a))

単純なアプローチ2:

この特定のケースでは、共通テーブル式(CTE)を試してください。

;with

   temp as ( 
      SELECT      a as Id
      FROM        BigTable
      WHERE       someRecords like '%blue'
   ),

 UPDATE    AnotherBigTable
 SET       someRecords = 'were Blue'
 FROM      AnotherBigTable
 JOIN      temp
   ON      temp.Id = AnotherBigTable.RecordId

CTEは非常に優れており、実際に作業したい特定のデータセットを、より大きなテーブルに含まれる無数のレコードから分離するのに役立ちます...同じCTE宣言を利用していることに気付いた場合は、その式をビューに形式化することを繰り返し検討してください。ビューは、多くのレコードと関係を持つ大規模で複雑なデータセットを管理するために、DBAおよびDBプログラマーにとって見過ごされがちで非常に価値のあるツールです。

于 2014-02-11T23:03:28.300 に答える