Closed Y-Wakuta closed 5 years ago
cassandra上のテーブルではpartition keyは一意なので、NoSEの条件である等号条件を使用したgetでは一行しか帰ってこない。これをNoSEの論文ではn=1に言っている。そして1つのrowの中にn個のcolumnが合った場合に次のcolumn familyに対してn回のgetが発行されることを言っている。
そして、上記の処理をCF+CFで行うと、1つ目のCFの結果を全てのnodeに対して行う必要があるため、非常に効率が悪い。一方、SI+CFの場合はSIの結果は1つのnodeの中で完了するため、効率が良い。
NoSEは以下の式でcostを評価している
step.cost = get_num × get_cost + width × width_cost
ここで、この式の$get_cost, width_cost$の値をSIを使用する場合にそれぞれ低く設定したい。 そこで、2つの変数、$client_db_network_cost,si2cf_cost$を設定する。 そして、それぞれの変数の値を低く設定する時は
(変数) * (si2cf_cost / (client_db_network_cost * width))
として低く設定するのはどうか。 次にどのようにこの2つの変数の値を取得するかについて以下の方法が考えられる。 まず、実験設定としてCassandraのノードは1つに設定する。 そしてその1つのノードに対して単純にCFにQueryを行う場合と、SIを使用してCFを行う場合の差をsi2cf_cost と考えられる。ただし、ここで、primary key とSIを貼る対象の属性は同じ特徴を持つ属性でないと公平ではなくなる。
si2cfCostにも1の結果のレコード数の積が掛かるはずだが、DBのノード内の話なので、クエリをその件数分発行することと比べたら無視できるということで上記の方法で進める。
SASIのクエリ実行時間がなかなか安定しないので、別Issueに切り出して計測する。
変数類は #71 で計測することにしてこのIssueを閉じる
頂いたコメント
NoSEですが column family を複数使ってクエリに応答するケースの join コストが,objective function に含まれてないように思います.本来,複数のcolumn family をジョインするコストは極端に大きいので,1つの column family で表現するようにするか,secondary index を使うかしないといけないと思います.1) 1つのCFを使うケース,2) SI + CF のケース,3) CF+CFのケース,これらのコストモデルを少し精緻にする必要がありそう.
いや,Cijは get operation 数を考慮して決定されるため,ジョイン結果の cardinality を予測して Cij を決定してるので,問題なさそう.
一方で,secondary index を利用する際には,secondary index を利用する際の get の呼び出し数 n + the next column family を使った結果の返却数 w だけを計上するべき(secondary index の返却数と next column family の getの呼び出し数は,共に通信コストを生まないため).