ブラジルの株式市場データを SQL Server データベースにインポートしています。現在、株式、オプション、フォワードの 3 種類の資産からの価格情報を含むテーブルがあります。私はまだ 2006 年のデータを使用しており、テーブルには 50 万件を超えるレコードがあります。12 年分のデータをインポートする必要があるため、テーブルは確実に 100 万レコードを超えます。
さて、最適化のための最初のアプローチは、データを最小サイズに保つことだったので、次の列で行サイズを平均 60 バイトに減らしました。
[在庫] [int] NOT NULL [日付] [smalldatetime] NOT NULL [オープン] [スモールマネー] NOT NULL [高] [少額] NOT NULL [低] [少額] NOT NULL [Close] [smallmoney] NOT NULL [取引] [int] NOT NULL [数量] [bigint] NOT NULL [ボリューム] [金額] NOT NULL
さて、最適化のための 2 番目のアプローチは、クラスター化インデックスを作成することでした。実際には、プライマリ インデックスは自動的にクラスター化され、Stock フィールドと Date フィールドを含む複合インデックスにしました。これはユニークです。同じ日に同じ株の 2 つの相場データを取得することはできません。
クラスタ化されたインデックスは、同じ株からの引用符がまとめられ、おそらく日付順に並べられるようにします。この 2 番目の情報は本当ですか?
現在、50 万件のレコードがあるため、特定のアセットから700 件の見積もりを選択するのに約 200ミリ秒かかります。この数は、テーブルが大きくなるにつれて高くなると思います。
3 番目のアプローチとして、テーブルを 3 つのテーブルに分割し、それぞれが特定の市場 (株式、オプション、フォワード) に対応することを考えています。これにより、おそらくテーブル サイズが 1/3 に削減されます。さて、このアプローチは役に立ちますか、それともあまり重要ではありませんか? 現在、テーブルのサイズは 50 MB であるため、問題なく RAM に完全に収まります。
もう 1 つの方法は、SQL Server のパーティション機能を使用することです。私はそれについてあまり知りませんが、通常、テーブルが大きく、I/O レイテンシを減らすために複数のディスクにまたがることができる場合に使用されると思いますよね? この場合、パーティショニングは役に立ちますか? 最新の値 (最近の年) と最も古い値を別のテーブルに分割できると思います. 最新のデータを探す確率は高くなります. 分割が小さいとおそらく速くなりますよね?
これを最速にするための他の良いアプローチは何でしょうか? テーブルの主な選択用途は、特定の資産から特定の範囲のレコードを検索することです。たとえば、資産 X の最新の 3 か月などです。別の用途もありますが、これが最も一般的であり、3k 以上で実行される可能性があります。ユーザーを同時に。