私は列ストア db ファミリを初めて使用し、いくつかの概念はまだ完全に明確ではありません。MemSQL を使用してスパース行列を格納したいと考えています。
テーブルは次のようになります。
CREATE TABLE matrix (
r_id INT,
c_id INT,
cell_data VARCHAR(10),
KEY (`r_id`, `c_id`) USING CLUSTERED COLUMNSTORE,
);
クエリ:
SELECT c_id, cell_data FROM matrix WHERE r_id=<val>;
つまり、行全体SELECT r_id, cell_data FROM matrix WHERE c_id=<val>;
つまり、列全体SELECT cell_data FROM matrix WHERE r_id=<val1> AND c_id=<val2>;
つまり、1 つのセルUPDATE matrix SET cell_data=<val> WHERE r_id=<val1> AND c_id=<val2>;
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 つの質問があります。
cell_data
のみが変更された場合 (Q4 など) 、単一行の挿入に関する問題は更新にも関係しますか?INSERT (? and UPDATE?) 操作を実行し、内容を定期的に列テーブルにバッチ処理するインメモリ行テーブルを作成することは可能でしょうか?
- 最新のデータ (?UNION ALL?) が必要な場合、どのように Q1,2 を実行しますか?
- 両方のテーブルで Q3 を実行しないようにすることはできますか (?これは 2 回の往復を意味しますか?)?
Q1とQ2の実行速度が気になります。それらに最適なクラスタ化されたキーです。上記のテーブルでレコードがどのように保存されるかわかりません。