単一ノードで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 が多く含まれているためです。
ありがとう。