fc2ブログ

インデックスを設定し検索を高速化する

データベースに格納されているデータをプログラムから利用するには、ある値をキーにして、検索することがほとんどです。そして、データ量が増えると、検索にも時間がかかり、プログラムの実行速度にも影響します。データベースでは、頻繁に検索を行うフィールドにインデックスを設定して、検索を高速化することができます。インデックスというのは、検索を早くするためにデータにあらかじめつけておく目次(=インデックス)のことです。では、ここで考えている時系列データのt_valueテーブルのレコード数はどのくらいになるでしょうか。概算でレコード数を計算してみたいと思います。
スポンサーリンク
例えば、1分足のデータを5年分投入したときのレコード数を計算してみます。
まず、先ほど述べたように、1分足1本で、レコードを5つ(始値、高値、安値、終値、出来高)使います。
1日の立会時間は、9時から15時までで昼休みを除くと、270分(大証は280分ですが、概算ですので270分と考えます)となり、ローソク足にすると1日270本引かれます。また、市場が開いている営業日は365日のうち土日祝日を除き、年間約240日と考えます。銘柄数は全部で約3500ありますが、すべての銘柄で1日に270本のローソク足が引けるほど取引は活発には行われていないでしょう。そこで、ここでは、その3分の1のおよそ1000銘柄で270本のローソク足があったものと考えてみます。
そうするとこれらを掛け合わせて、5レコード×270本×240日×5年×1000銘柄=1,620,000,000レコードとなります。つまり、約16億件以上のレコードが必要になるわけです。実際、たった今の筆者のデータベースのレコード数の概算を見ると2,187,540,000件となっていました。このデータベースには、約5年分の分足データの他にも、約20年分の日足データや数か月分のティックデータが含まれているので、先ほどおよそで計算した値はほぼ妥当だということがお分かりいただけるでしょう。

さて、話を元に戻して、なぜレコード数を計算したかというと、データベースの高速化設定が必要かどうかを考えたかったからです。この約16億件以上のデータ量を考えると、インデックスを設定して高速化したほうが良さそうです。インデックスは、主キーのフィールドには自動的に設定されています。それ以外のフィールドで、頻繁に検索のキーに使うフィールドがあれば、自分でインデックスを設定する必要があります。今回のt_valueテーブルで言えば、日時で検索したり、絞り込んだりすることが多くなりますので、datetimeフィールドにはインデックスを付けておいたほうがよいでしょう。
postgresの場合、インデックスの設定はpgAdminⅢから行うことができます。フィールドを選択して、右クリックメニューからインデックスの作成を選択すればよいだけです。
スポンサーリンク
<<より汎用的な時系列データを扱うためのテーブル | ホーム | PostgresのテーブルからEntityクラスの自動生成>>
コメント(0)
コメントの投稿
トラックバック(0)