データベース全体をメモリにロードしたいのですが、どうすればいいですか?約256 GBのメモリがあり、私のデータベースは約200 GBなので、メモリ内で簡単に処理できます。
select count(*) from table1
を実行すると、sqlserverはテーブルをメモリに自動的にロードします。その後、テーブルを非常に高速に使用できますが、データベース全体をメモリにロードする方法を知りたいですか?
各テーブルでselect count(*) from
を実行すると、より速く作業できますが、データベース全体をメモリにロードする他の方法はありますか?テーブルごとにselect count(*) from
ではなく、単一のコマンドでデータベース全体をロードしたい。
データベース全体をメモリにロードしたいのですが、どうすればいいですか?
何かを行う「方法」を理解する前に、何かを行う必要がある「理由」を明確にすることがしばしば最善です。では、なぜデータベース全体をメモリにロードしたいのでしょうか?メモリは有限のリソースであるため、効率的/賢く使用する必要があります。
約256 GBのメモリがあり、データベースは約200 GBなので、メモリ内で簡単に処理できます
さて、56 GBのRAM=データベースのサイズを超えているようです。しかし、データ自体の外では考慮されていないものを次に示します。
ここで、その200 GBのデータに関して、これを考慮する必要があります。all 200 GBのデータを使用しますか?疑わしい。データページをメモリに読み込んで参照しないと、効率が悪く無駄になります。必要に応じてページをロードする方がはるかに優れています。ページを取得するために使用されたディスクI/Oと、それらが使用するメモリは、どちらも必要ないページで無駄にしないため、これらのリソースの両方に値するからです。
テーブルごとに_
SELECT *
_ではなく、単一のコマンドでデータベース全体をロードしたい。
いいえ、これを行う単一のコマンドはありません。
また、SELECT COUNT(*)
メソッドはこの目標を達成することすらできません。それが行うすべては、スキャンを介して、それが見つけることができる最小のオブジェクトをロードすることです。しかし、ロードされません:
COUNT(*)
操作でスキャンされなかったオブジェクト。したがって、COUNT(*)
操作に非クラスタ化インデックスが使用されている場合は、すべての非クラスタ化インデックスのインデックススキャンやテーブル/クラスタ化インデックススキャンを強制する方法を見つける必要があります。しかし、それらは常に使用されるとは限らないだけでなく、毎回それらをロードすると、実際に使用されていないインデックスを特定するためのインデックスDMVを使用する能力に反するため、さらに無駄になります!RAMを「Ram Drive」としてサードパーティのソフトウェアを使用して変換できます。テスト目的で使用したものは「RamDisk」と呼ばれ、Googleで検索できます。はい読み取り/書き込みの速度が約5/10倍高速になりますが、停電が発生するとデータが失われるだけです。重要なデータを保存している場合は、常にバックアップを使用してください。