2017-06-29 15 views
0

私は、従来のストアドプロシージャ(いくつかの他の子ストアドプロシージャを呼び出す)の更新に取り組んでいます。トランザクション内では、約12ダース程度のテーブルのデータを操作し、テーブルロックまでのロックエスカレーションをトリガすることがあります。このプロセスは、場合によっては完了までに20分以上かかることがあります。明らかに、その長い間のテーブルをロックすることは大きなノーではありません。だから私はフェーズ1でこのsprocによって引き起こされたブロッキングを減らすための2段階計画に取り組んでおり、フェイズ2で過度の時間を費やさずに効率的で完全に書き換えます。ブロッキングを減らして、データベーステーブルに操作がある場合は、その操作を一時テーブルに移動する予定です。テンポラリテーブルのすべての作業を行い、プロセスの最後に実際のテーブルを最終結果で更新することで、他のユーザをブロックするのにかかる時間を大幅に短縮できるはずです。テンポラリテーブルにユニークなインデックス名が必要

ここに私の問題があります:これらのテンポラリテーブルの中には、さまざまな計算に使用している間に、100,000行以上あるものがあります。このため、パフォーマンスを維持するために一時テーブルにインデックスを生成したいと考えています。これらはストアドプロシージャ内で作成される一時テーブルなので、同時に複数のユーザーがsprocを実行すると、エラーを回避するために一意の名前を付ける必要があります。私は手動でCREATE TABLEステートメントを使って一時テーブルを宣言できることを知っています。もしそうすれば、名前なしでインデックスを指定してSQL Serverで名前を作成させることができます。私ができることを望んでいるのは、SELECT * INTOを使用して一時テーブルを生成し、SQL Serverにインデックス名を自動的に生成させる別の方法を見つけることです。私はあなたが「なぜ?」と尋ねていると確信しています。私の会社は、私が働いているシステムのためのいくつかの変更点を持っています。 SELECT INTOメソッドを使用すると、列の追加やサイズ変更などが行われた場合、これらのストアドプロシージャに戻ってその変更を行う必要があることを知りたい開発者には問題はありませんtempテーブルの定義を一致させる必要があります。 SELECT INTOを使用すると、「実」テーブルのレイアウトに一致する一時テーブルが自動的に保持されます。

SQL Serverで(CREATE TABLE構文の一部として実行するのではなく)一時表の索引の名前を自動生成する方法を知っている人はいますか?

ありがとうございました!

+0

制約を作成する場合のみ、各セッションに制約の一意の名前が必要です。一意索引を作成するだけであれば問題ありません。あなたは@DavidBrowneのサンプルを実行し、ユニークなインデックスを作成するように変更することができます。 – Wendy

+0

インデックスに名前を付けない限り、問題はないはずです。 –

答えて

1

これらはストアドプロシージャ内で作成される一時テーブルなので、複数のユーザーが同時にsprocを実行すると、エラーを回避するために一意の名前が必要です。

いいえいいえ。各セッションには独自の一時表があり、自動的にクリーンアップされます。

インデックスにはグローバル名スコープがないため、各テンポラリテーブルに同じインデックス名を付けることができます。例えば

create procedure TempTest 
as 
begin 
    select * into #t from sys.objects 
    create index foo on #t(name) 
    waitfor delay '00:00:10' 
    select * from #t 
end 

そして、あなたは複数のセッションから

exec temptest 
go 10 

を実行することができます。

+0

D'oh!あなたはそれを見ますか?ありがとうございました。私の問題は無効な前提に基づいていたことがわかります。 – DeadZone

関連する問題