1

私は列ストア db ファミリを初めて使用し、いくつかの概念はまだ完全に明確ではありません。MemSQL を使用してスパース行列を格納したいと考えています。

テーブルは次のようになります。

CREATE TABLE matrix (
r_id INT,
c_id INT,
cell_data VARCHAR(10),
KEY (`r_id`, `c_id`) USING CLUSTERED COLUMNSTORE,
);

クエリ:

  1. SELECT c_id, cell_data FROM matrix WHERE r_id=<val>;つまり、行全体
  2. SELECT r_id, cell_data FROM matrix WHERE c_id=<val>;つまり、列全体
  3. SELECT cell_data FROM matrix WHERE r_id=<val1> AND c_id=<val2>;つまり、1 つのセル
  4. UPDATE matrix SET cell_data=<val> WHERE r_id=<val1> AND c_id=<val2>;
  5. INSERT INTO matrix VALUES (<v1>, <v2>, <v3>);

クエリ 1 と 2 はほぼ同じ頻度であり、3、4、5 も同じ頻度です。Q1,2 の 1 つは、Q3,4,5 の 1 つと同じ頻度です (つまり、Q1,2:Q3,4,5 ~= 1:1)。

一度に 1 つの行を列ストアに挿入すると、挿入ごとに行セグメント グループが作成され、パフォーマンスが低下することを認識しています。インサートをバッチ処理できません。また、メモリ内の行ストアを使用できません (マトリックスが大きすぎます)。

3 つの質問があります。

  1. cell_dataのみが変更された場合 (Q4 など) 、単一行の挿入に関する問題は更新にも関係しますか?

  2. INSERT (? and UPDATE?) 操作を実行し、内容を定期的に列テーブルにバッチ処理するインメモリ行テーブルを作成することは可能でしょうか?

    • 最新のデータ (?UNION ALL?) が必要な場合、どのように Q1,2 を実行しますか?
    • 両方のテーブルで Q3 を実行しないようにすることはできますか (?これは 2 回の往復を意味しますか?)?
  3. Q1とQ2の実行速度が気になります。それらに最適なクラスタ化されたキーです。上記のテーブルでレコードがどのように保存されるかわかりません。

4

1 に答える 1

1

1. はい、単一行の更新もパフォーマンスが低下します。基本的には、削除と挿入です。

2. はい。実際、これはバックグラウンドで自動的に行われます。最近挿入されたデータ (行数が少なすぎて適切な列セグメントにならない場合) は、メモリ内の行ストア形式で保持され、クエリを読み取ります。基本的に、そのデータと列指向のデータの UNION ALL を見ています。次に、このデータをまとめて、列指向の形式に書き込みます。

それが十分に機能しない場合、ワークロードによっては、上記の動作に依存する代わりに、行ストア テーブルにデータの一部を明示的に保持することでメリットが得られる場合があります。その場合は、次のようになります。

2a. はい、最新のデータを表示するには、UNION ALL を使用します

2b. データはどちらのテーブルにもある可能性があるため、両方をクエリする必要があります (Q1,2 のように、UNION ALL を使用して動作します)。これは 2 回の往復ではなく、1 回だけです。

3. 列ストア キーで最初に r または c で並べ替えることができます。現在のスキーマでは r です。これにより、行のクエリは効率的になりますが、列のクエリは非常に非効率的になり、基本的にテーブル全体をスキャンする必要がある場合があります (データのパターンによって異なります)。残念ながら、列ストア テーブルは複数のキーの使用をサポートしていないため、これを解決する良い方法はありません。潜在的なハッキーな解決策の 1 つは、テーブルの 2 つのコピーを維持することです。1 つはキー (r, c) を持ち、もう 1 つはキー (c, r) を持ちます。これは基本的に、2 つのインデックスを手動で維持することです。

説明しているワークロードに基づいて、多くの単一行クエリ (ワークロードの 50% である Q3、4、5) を実行しているように思えますが、行ストアは列ストアよりもはるかに適しています ( http:/を参照) /docs.memsql.com/latest/concepts/columnstore/ )。残念ながら、メモリに収まらない場合は、メモリを追加する以外に良い方法はありません。

于 2015-12-08T20:24:14.017 に答える