単一ノードでPostgreSQLとCassandra の読み取りパフォーマンスを比較したい。
8 列、150000 行のテーブルがあります。列ファミリーに変換するために、主キーを Cassandra の行キーにし、残りの列は PostgreSQL と同じです。また、両方のデータがディスク上にあるように、データを Cassandra SSTables に一括ロードしました。
PostgreSQL からテーブルを読み取るには:
 select * from tableName;
200ms程度かかります。
列ファミリー (キーキャッシュと行キャッシュを有効にして) を読み取るために、thrift API (get_range_slices メソッド) と CQL2.0 の両方を試しました。前者は平均して約 7000 ミリ秒かかり、後者は耐え難いほど 100000 ミリ秒かかります。
Cassandra Memtables から読み取ると、かなり高速になる可能性があります。しかし、どちらもディスクから読み取るのに、なぜ Cassandra はずっと遅いのでしょうか?
根底にあるメカニズムは何ですか?
編集:
顧客列ファミリー
CREATE COLUMN FAMILY customer
WITH comparator = UTF8Type
AND key_validation_class = UTF8Type
AND caching = all
AND column_metadata = 
[
 {column_name: C_NAME, validation_class: UTF8Type},
 {column_name: C_ADDRESS, validation_class: UTF8Type},
 {column_name: C_NATIONKEY, validation_class: UTF8Type},
 {column_name: C_PHONE, validation_class: UTF8Type},
 {column_name: C_ACCTBAL, validation_class: UTF8Type},
 {column_name: C_MKTSEGMENT, validation_class: UTF8Type},
 {column_name: C_COMMENT, validation_class: UTF8Type}
];
これが私の倹約クエリです
   // customer is that column family of 150000 rows
   ColumnParent cf1 = new ColumnParent("customer");
   // all columns
   SlicePredicate predicate = new SlicePredicate();
   predicate.setSlice_range(new SliceRange(ByteBuffer.wrap(new byte[0]), ByteBuffer.wrap(new byte[0]), false, 100));
   // all keys
   KeyRange keyRange = new KeyRange(150000);
   keyRange.setStart_key(new byte[0]);
   keyRange.setEnd_key(new byte[0]);
   List<KeySlice> cf1_rows = client.get_range_slices(cf1, predicate, keyRange, ConsistencyLevel.ONE);   
また、私のCQL2.0クエリ:
   select * from customer limit 150000;
編集:
私は誤解を招くタイトルで自分を責めており、提供されたデータはさらに論争を引き起こす可能性があります. ここで勝者を選んでいるわけではありません。
どちらもディスク I/O を実行しており (これは Cassandra の一般的な使用例ではありません)、時間が異なるため、何らかの理由があるはずです。彼らがそれに対処する方法に興味があります。ですから、根底にあるメカニズムに光を当てていただければ幸いです。
これはリンゴとリンゴの比較ではありませんが、私の懸念はフレーバーです. 1 つの方が酸味が強いのは、おそらくビタミン C が多く含まれているためです。
ありがとう。