これはおそらく長い間浮かんで、さまざまな「コンサルタント」のポケットに餌をやるでしょう。すべての神話のように、それは真実の核と多くのBSを持っています。
真実:SQL 2000およびそれ以前のバージョンには、tempdbでのエクステントの割り当てに関する既知の競合の問題がありました。競合は実際にはすべてのデータベースで当てはまりましたが、tempdbの使用量が多いため、tempdbでより顕著になりました。KB328551に記載されています:
tempdbデータベースが頻繁に使用されると、SQLServerがページを割り当てようとしたときに競合が発生する可能性があります。
sysprocessesシステムテーブルの出力から、waitresourceは「2:1:1」(PFSページ)または「2:1:3」(SGAMページ)として表示される場合があります。競合の程度によっては、SQLServerが短期間応答しなくなったように見える場合もあります。
これらの操作はtempdbを多用します。
一時テーブル(ローカルまたはグローバル)の作成と削除を繰り返します。
ストレージの目的でtempdbを使用するテーブル変数。
CURSORSに関連付けられた作業テーブル。
ORDERBY句に関連付けられた作業テーブル。
GROUPBY句に関連付けられた作業テーブル。
HASHPLANSに関連付けられた作業ファイル。
これらのアクティビティを頻繁かつ重要に使用すると、競合の問題が発生する可能性があります。
トレースフラグ-T1118
がSQLServer2000 SP3に追加され、SQLが混合ページの割り当てにラウンドロビンアルゴリズムを使用するように強制されていました。この新しいアルゴリズムは、CPUごとに1つずつ、同じサイズのファイルのセットの上にtempdbをデプロイする方法と関連付けると、競合を軽減します。トレースフラグはSQL2005/2008に引き続き存在しますが、必要になる可能性ははるかに低くなります。
この神話に関する他のすべては、ほとんどBSです。
- #tempテーブルを使用するとブロッキングが発生しますか?いいえ。最悪の場合、SQL 2000以前では負荷がかかった状態で競合が増加しますが、それが何かをブロックするとは言えません。最初に測定して、これが当てはまるかどうかを確認する必要があります。その場合は、修復手段を展開します(CPUごとに1つのtempdbファイルを割り当て、同じサイズにし、-T1118をオンにします)。
- select ... into #tempは、selectの期間中、何かをブロックしますか?あまり。
- select ... into #tempは、selectを含むストアドプロシージャの期間中、何かをブロックしますか?地獄はありません。その主張を読んだだけで、私は突然笑いました。
詳細については、この記事があります:TF1118に関する誤解。