web-dev-qa-db-ja.com

SQL Serverは、列ストアインデックス付きテーブルを保持するために、従来の行ストアよりも多くのRAMを必要としますか?

(SQL Server 2014)クラスター化列ストアインデックスをいくつかの非常に大きくて幅の広いテーブルに実装したいと思います。これをサポートするには、さらにRAM=が必要ですか?必要な場合、どのくらいの量を判断できますか?

4
Cyndi Baker

考慮すべきいくつかの側面があります。

  1. 列ストアオブジェクトは、バッファープールではなく独自の領域にキャッシュされます http://www.nikoport.com/2014/08/11/clustered-columnstore-indexes-part-38-memory-structures/ しかし、SQL Serverは、バッファープールまたは列ストアオブジェクトプールへの領域の割り当てを管理します
  2. 列ストアオブジェクトは、データが行グループに読み込まれるときに処理する必要があり、これはメモリを大量に消費する操作です
  3. データは高度に圧縮されているため、データが行として格納されている場合よりも列ストアに格納されている場合の方がより多くのデータをRAMにキャッシュできます。

「より多くのRAMが必要ですか」という質問に関しては、エンジンはインデックスを作成するときに利用可能なすべてのRAMを使用するため、厳密な制約がない限り、答えはおそらくノーです。 http://www.nikoport.com/2014/06/21/clustered-columnstore-indexes-part-31-memory-pressure-and-row-group-sizes/

5
mendosi

詳細RAM何とは対照的ですか?通常のクラスター化インデックスと比較して、データは高度に圧縮されているため、クエリ中に必要なメモリが少なくなります。ただし、CCIの構築プロセスはメモリを大量に消費する可能性があります。 製品ドキュメント を参照してください

列ストアインデックスを並列で作成するのに十分なメモリを計画する列ストアインデックスの作成は、メモリが制限されていない限り、デフォルトでは並列操作です。インデックスを並列で作成すると、連続してインデックスを作成するよりも多くのメモリが必要になります。十分なメモリがある場合、列ストアインデックスの作成には、同じ列にBツリーを構築する場合の1.5倍の時間がかかります。

列ストアインデックスを作成するために必要なメモリは、列の数、文字列列の数、並列度(DOP)、およびデータの特性によって異なります。たとえば、テーブルの行数が100万未満の場合、SQL Serverは1つのスレッドのみを使用して列ストアインデックスを作成します。

テーブルに100万行以上あるが、SQL ServerがMAXDOPを使用してインデックスを作成するのに十分なメモリ許可を取得できない場合、SQL Serverは利用可能なメモリ許可に適合するために必要に応じてMAXDOPを自動的に減らします。場合によっては、制約のあるメモリでインデックスを構築するために、DOPを1に減らす必要があります。

5
Chad Mattox

主なポイントは、mendosiによる回答ですでに述べられています。Columnstoreオブジェクトプールは、バッファープールの外側にあります。彼がリンクしたブログを参照してください。

質問は少し不明確です。

列ストアインデックスの使用を開始するときに、バッファープールに同じメモリを使用できるようにしますか?はいの場合:

  • インスタンスのMAXメモリ設定を変更しないでください(マシンに他に何があるかを考慮して、すでに適切な値に設定されていると仮定します)。
  • Columnstoreオブジェクトプールに必要になるため、マシンのメモリを増やします。いくら? Enterprise Editionの列ストアオブジェクトプールにはメモリの制限はありません。 SQL 2016 SP1 + Standard Editionでは、Columnstoreオブジェクトプールはインスタンスごとに32GBに制限されています( SQL Server 2016 SP1:制限を知っている を参照)。

一方、バッファープールで問題がなくメモリが少ない場合や、マシンのメモリを増やすことができない場合は、列ストアオブジェクトプールにメモリが必要になるため、インスタンスの最大メモリ設定を減らします。

いずれの場合でも、メモリ使用量を監視し、それに応じてマシンのメモリやMAXメモリの設定を調整することをお勧めします。開始点として、いくつかのDMV:

SELECT * FROM sys.dm_os_sys_memory;
SELECT * FROM sys.dm_os_process_memory;
SELECT * FROM sys.dm_os_memory_broker_clerks; --undocumented DMV!

SELECT
   name
  ,type
  ,memory_node_id
  ,pages_kb
  ,page_size_in_bytes
  ,virtual_memory_reserved_kb
  ,virtual_memory_committed_kb
  ,shared_memory_reserved_kb
  ,shared_memory_committed_kb
FROM
   sys.dm_os_memory_clerks
ORDER BY
   pages_kb DESC;
0