SQL Server-一時テーブルと物理テーブル


14

私の職場では、#tempテーブルの使用をやめて、代わりにSPIDを含む永続的な物理テーブルを使用する動きが進行中です。以前に#tempテーブルにINSERTしたことがある場合は常に、たとえばストアドプロシージャの先頭にある一連INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPIDステートメントと共に、が必要になります。さらに、言うまでもなく、これらの「一時データを保存するための永続テーブル」が使用される場所では、を含めるように注意する必要がありますWHERE SPID = @@SPID

このプラクティスへの移行の背後にあるロジックは、クエリが実行されているサーバーの全体的なパフォーマンスを向上させることです(tempdbのI / Oと競合を減らすことにより)。私はいくつかの理由でこのアプローチに熱心ではありません-く、潜在的に危険であり、新しいスキームを使用するクエリのパフォーマンスを損なう可能性があるようです。

#tempテーブルを削除するためのこれまたは類似のアプローチの経験はありますか?

回答:


18

IOや競合を減らすのではなく、両方を増やすことが非常に簡単に実証できます。

  • IO:#tempテーブルから挿入、読み取り、または削除されたすべての行は、@@ SPIDテーブルから挿入、読み取り、または削除されます。しかし、すべての行は@@ SPID列が追加されて広くなるため、必要なページ数はわずかに増加し、IOはこれまでになく大きくなります。しかし、もっと重要なのは、#tempテーブルのドロップとセッションによる新しいセッションの#tempテーブルの初期化をでシミュレートする必要があるDELETE FROM @@spidTable WHERE spid = @@SPIDため、切り捨て/作成操作(ページ範囲管理操作など)が変換されることです。行操作では、比類のないほど遅くなります。
  • 競合:#tempテーブルでページロックを使用していたすべてのスキャンで、関連のないspid行でページがロックされる可能性があり、以前は存在しなかった競合が発生します。ロックエスカレーションのしきい値に達するより多くの更新を行うたびに、ロックをテーブルロックにエスカレートする機会があり、他のすべてのspid をブロックします。

したがって、tempdbで神話上のIAM / SGAM / GAMの競合に遭遇しないのは事実ですが、これが起こる唯一の理由は、通常の追加のIOおよび追加の競合のために操作がはるかに遅くなるためです。


私は上記のレムスに完全に同意します-そして、素晴らしい反応に感謝します。問題は、サードパーティのアプリケーション(独自のデータベースがあるサーバー上にいくつかのデータベースがある-クエリとそのデータを実行する必要がある)で想定されるパフォーマンスヒットを引き起こしていることです。私はまだあなたが正しいと思います-I / Oに関しては新しいアプローチは以前よりもかなり悪いパフォーマンスになると予想します-競合に関してはtempdbの観点からは物事は良くなるでしょう-私たちからはやや悪いです。
ウィルA

tempdbファイルはいくつありますか?標準セットアップは、実際にはまったくスケーリングしません。目に見えるプロセッサコアごとに1つ(hyper-vの場合はそれぞれ2つ)、複数のtempdbファイルとログファイルが必要です。
トムトム

1
最も一般的なtempdbスケーラビリティの問題に対処するため、sqlskills.com / BLOGS / PAUL / post / sqlskills.com/BLOGS/PAUL/post/…の 2つの記事を読む必要があります。
レムスルサヌ

@TomTomおっと、おっと。複数のログファイル?本当に?
アーロンバートランド

5

これは抜本的な解決策のようです。tempdbの競合を減らす(およびその使用法を最適化する)ことについて多くのオンラインの記事があります-組織はその方法を徹底的に検討しましたか?

http://www.sql-server-performance.com/tips/tempdb_p1.aspx

http://www.sqlservercentral.com/blogs/robert_davis/archive/2010/03/05/Breaking-Down-TempDB-Contention.aspx

http://searchsqlserver.techtarget.com/tip/Optimize-tempdb-in-SQL-Server-by-striping-and-splitting-to-multiple-files


+1は完全に同意します-tempdbを最適化します。実装が悪化するため、車輪を再発明しないでください。:)

正当化できない場合、この道をたどらないのは私です-Benの情報に感謝します-必要に応じてDBAを調査し、提案します。
ウィルA

2

tempDB内のパフォーマンスの問題をトラブルシューティングする必要があるように思えますが、ここにいくつかの提案があります


便利そうに見えます-SPE109に感謝します。これを確認し、必要に応じてDBAに推奨事項を作成します。
ウィルA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.