データとはなにか? インデックスとは何か? アプリケーションとはなにか?
いろいろ考えての文章なんで、抽象的で、難解かもしれません。
ビッグなデータ(10億行程度の時系列CSVファイルを想定)を扱っていて、ふと思ったことです。データとはなにか、インデックスとは何か? を考えて ふと ? と思ったことを書いてみます。
データとはなにか? 解釈する存在があってデータは存在する。
データとは何かを考えるといきなりわけわからなくなります。(少なくとも私には)
まず、人類が滅亡した後、記憶媒体にデータがあるとき、それはデータといっていいのでしょうか?
解釈主体があってデータは存在します。 としましょう。それで
中身解釈不能なバイナリーファイルがあるとき、それは、データなんでしょうか?
解釈主体(人間)に解釈不能なデータはデータではありません。
というわけでこれって何という説明が必要です。 自己言及的 な情報がいわゆるメタ情報が必要になります。
で、メタ情報はどうして解釈可能なんでしょうか?
データというときに、何を前提にしているのか? が意外と曖昧です。
まず、あまり曖昧でないところからいきましょう。
どこにあるのか → 記憶媒体
チューリングマシン的に考えるとデータは記憶媒体の中にあり、記憶番地をもっています。記憶番地があるのは、いいのですが、あったからどうなんでしょうか?
主体がある ← 記憶媒体を読み取り、なんか動作する主体
要するに、どんな議論でも暗黙の前提があるのです。
それで、どう議論をすすめるか? インデックスの機能から迫ります。インデックスの実装は、なんでもよいとします。どんな前提をもっているか? を提示しますので、そうかなと思ってください。
インデックスの機能は、全件走査しなくても、データの情報を返すと 仮定義します。
使っている用語は、バリバリ曖昧です。機能、走査、返す。。。。 具体的なデータは、10億行、3GB程度のCSVがもとで、それになんらかのインデックスをつけるとおもってください。用語の曖昧さは、想定している具体例で脳内補完しましょう。
まず、基本的な機能 検索以前の機能です。どんなインデックスでも下記はできるのでしょうか?
さて、データは、テーブルだと思ってください。行と列があります。
機能 | インデックス | ない場合 |
---|---|---|
先頭行取得 | すぐに返す | 先頭行の終わりまで走査して返す |
行数取得 | すぐに返す | 全件走査 |
行番号指定 | 指定された行番号のバイナリ上の位置指定 | 見つかるまで走査 |
次行指定 | 次の行の位置(値)が取得できる | 次の行がわかるまで走査 |
この4つがまずは重要みたいです。どうでしょうか?先頭行、行数(件数)、行番号指定、次行指定 を最低限のインデックスの機能と考えます。
ハッシュインデックスだと、行番号って何?かもしれません。行番号指定はできないのもあるかもしれません。
さて、B-tree では、この4つの機能は使えるのでしょうか?
ここでちょい追い打ちをかけます。
先頭行は、すぐにわかるのだろうか?
データは、CSVファイルを念頭においてあるけど、検索結果だとするとどうなるのだろうか? 検索結果の最初の行のバイナリ上の位置情報は、自明ではない気がします。データとはなんですか? データベースとはなんですか? という疑問です。
検索結果は、データなんでしょうか? これは、検索結果が記憶媒体上に存在しているかどうかという問でもあるようです。
インデックスを機能としてとらえると明確でないと思うことは際限なくでてきます。
ファイルまたぎで、インデックスをつかえるか?
複数のファイルがあるときに、インデックスはそのまま使えないのが通常です。それぞれのインデックスをつかって検索して、結果を統合するのが通常です。複数のファイルに対して、あたかもインデックスがついているように扱うことは難しいです。
インデックスは、定義可能か?
インデックスの厳密な定義は難しいので、とりあえずsqlite のインデックス を念頭においてみましょう。
sql 文で、先頭行取得などを表現してみましょう。
機能 | sql |
---|---|
先頭行取得 | select * from xxx limit 1 |
行数取得 | select count(*) |
行番号指定 | ? |
次行指定 | ? |