インデックスはメモリを消費しますか?


10

SQL Serverでのメモリ使用量について学び始めました。質問SQL Server 2008 R2「ゴーストメモリ」への回答でクエリを使用する場合 、私は単一のデータベースがバッファプールの非常に大きな領域を占有していることを発見しました。さらに調べてみるsys.allocation_unitssys.indexes、とを使用して、データベースでインデックスが頻繁に使用されていることが原因であることを確認しました。ほとんどのインデックスはクラスター化されています。

別のデータベース開発者は、サーバーでメモリの問題が発生していると考えています。利用可能なメモリがないため、クエリが長く実行され始めています。

私の質問はここにあります-これらのインデックスの使用とバッファプール内でのそれらの存在は、他のプロセスで利用可能なメモリを奪いますか?


2
"Another database developer believes we are having memory issues on the server"-何に基づいていますか?サーバーに搭載されているRAMの量、インスタンスメモリの設定、およびプロシージャキャッシュによって消費されているメモリの量はどれくらいですか。
Jon Seigel

クエリ時間の延長に基づいて、タスクマネージャーを調べたところ、私の調査で「汚い、汚い嘘つき」であることがわかりました(Brent Ozarに感謝-brentozar.com/archive/2011/09/…)。私はメモリの問題がないことに気付くかもしれません-私はこれらのコメントと回答で提供されるすべての提案に従っています!
JHFB、2012

2
ここでは8ボールを転がしているので、クエリはその「別の」データベース開発者によって記述されたため、実行速度は遅いと思います...
Remus Rusanu

回答:


12

はい。バッファプールにキャッシュされている使用済みインデックスのデータページは、データキャッシュのスペースを占有します。ただし、インデックスを使用しないようにしてください(最初に、クラスター化インデックスは実際のテーブルデータなので、そのことも覚えておいてください)。インデックスの使用(もちろん、適切に設計および実装されている)は良いことです。

メモリの問題は、ほとんどの場合、テーブルにインデックスがあることによるものではありません。メモリの問題に飛び込み、問題は正確には何ですか?ページの寿命が短いですか?サーバーでメモリはどのように構成されていますか?最大サーバーメモリが低すぎてバッファープールのサイズが制限されていますか?

データキャッシュのインデックスページの内訳を取得するには、次のクエリを実行します。

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type

データベースごとにこれらの統計を取得するには:

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc

まともな(?)ページ寿命-4234。バッファキャッシュヒット率を調査し、他の部分を調べる必要があります。
JHFB、2012

そのPLEはまったくメモリ不足を示していません。目安として1000を超えるものはもちろん(もちろん、常に「依存します」)、許容範囲です。
トーマス・ストリンガー

バッファキャッシュヒット率は、非常に誤解を招く可能性があります。@JonathanKehayiasによるSQL Server Debates:Buffer Cache Hit Ratioを参照してください。
Mark Storey-Smith

@ MarkStorey-Smith指摘、ポインタへの感謝!
トーマスストリンガー、2012

@JHFB一歩戻りましょう。記憶のプレッシャーを感じているのはなぜですか?
トーマスストリンガー、2012

7

はい、インデックスはバッファプールスペースを消費します。これは、インデックス作成戦略に注意を払い、重複を最小限に抑える必要があるもう1つの理由です。

これはデータベースでインデックスが頻繁に使用されていることが原因である可能性が高いことを確認しました。ほとんどのインデックスはクラスター化されています。

クラスタ化インデックスはテーブルであることに注意してください。ヒープのそれ以上のクラスター化インデックスに存在する唯一のオーバーヘッド(これは一般に望ましくありません)は、非リーフインデックスページと、そのテーブルのすべての非クラスター化インデックスに含まれるクラスターキーのオーバーヘッドです。このため、ナロークラスタキーが推奨されます。

クラスター化されたキーの選択に関するKimberley Trippの記事は、これに関する優れたリファレンスです。


+1そのMs Trippの記事はクラスタリングキーに関するEPICです...
Fabricio Araujo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.