あるストアドプロシージャで以下のことを行っ

Writer: admin Type: santa Date: 2019-01-21 00:00
あるストアドプロシージャで以下のことを行っています。1.一時テーブル(フィールドの数30個)を作成(CREATE TABLE #テーブル名)2.ある動的SQL(SELECT文)を実行した結果(複数件)を、カーソルを使用してループ処理します。ループの中では以下のことを行います。 2-1.ある判定処理を行い、True or Falseを特定します。 2-2.Trueになったレコードの情報(フィールドの数30個)を、1で定義した一時テーブルに格納(INSERT)します。3.ループを抜けたら、一時テーブルを全件検索して、ストアドプロシージャの結果として出力します。上記は、システム全体で使われている ストアドプロシージャやSQLの1つなんですがManagement Studioの「利用状況モニター」で「最新のコストの高いクエリ」を見ると必ず、上記ストアドプロシージャの ・FETCH NEXT FROM カーソル名 ・INSERT #一時テーブル名が登場します。カーソルの設定に誤りがあるのか?一時テーブルを使っているのが問題なのか?が分からず 困っております。上記の情報で、改善できる箇所が 分かる方いらっしゃいましたら、ご指摘の程、宜しくお願い致します。共感した0###自分もよく分かっていないところがありますが・FETCH NEXT FROM カーソル名これはカーソルの元になっているSQLの内容による可能性があるように思いますが。SQLの実行計画を確認してみてください・INSERT #一時テーブル名SQL serverの一時テーブルはtempdbに作られます。・tempdbのファイル競合が発生していないか・一時テーブルにインデックスを作成したためのオーバーヘッドの可能性がないかあたりはどうでしょう。あと一時テーブルに格納するデータ件数が少ないならテーブル変数の使用も検討してみてはナイス0
###> ・FETCH NEXT FROM カーソル名> これはカーソルの元になっているSQLの内容による可能性があるように思いますが。> SQLの実行計画を確認してみてください元になっている SQL 今一度確認してみます。> ・INSERT #一時テーブル名> SQL serverの一時テーブルはtempdbに作られます。> ・tempdbのファイル競合が発生していないか> ・一時テーブルにインデックスを作成したためのオーバーヘッドの可能性がないか一時テーブルにインデックスは作成していないためtempdbのファイル競合で調べたところtempdbの数をCPUコア数に合わせる対応がされていませんでしたので、それを対応してみたいと思います。

 

TAG