現在、私たちはビッグテーブルクエリのパフォーマンスに複数列ファミリを使用することの影響を調査中です。列を複数の列ファミリに分割してもパフォーマンスは向上しません。誰も似たような経験をしていますか?ビッグテーブルのパフォーマンス影響列ファミリ
ベンチマークの設定についてさらに詳しく説明します。現時点では、本番表の各行に約5個の列があり、それぞれには0.1〜1 KBのデータが含まれています。すべての列は1つの列ファミリに格納されます。行キー範囲フィルタ(平均340行を返す)を実行し、(各行に1つの列のみを返す)列正規表現フィット器を適用すると、クエリの平均は23,3msです。私たちはいくつかのテストテーブルを作成しました。そこでは、1行あたりのカラム/データ量を5倍に増やしました。テストテーブル1では、すべてを1つのカラムファミリにまとめました。予想通り、同じクエリのクエリ時間が40,6msに増加しました。テスト表2では、元のデータを1つの列ファミリに保存しましたが、余分なデータは別の列ファミリに格納されていました。元のデータを含む列ファミリを照会すると(元のテーブルと同じ量のデータが格納されます)、照会時間は平均44,3msでした。そのため、より多くの列ファミリを使用するとパフォーマンスが低下しました。
これは、私たちが期待していたのと正反対です。例えば。これは、カラムファミリーにBigtableのドキュメント(https://cloud.google.com/bigtable/docs/schema-design#column_families)
データのグループ化に記載されているあなたは、むしろ、各行のすべてのデータを取得するよりも、単一の家族、または複数の家族からデータを取得することができます。最も頻繁に行われるAPI呼び出しで必要な情報だけを取得することができます。
我々の調査結果についての説明をお持ちの方?
(編集:追加いくつかの詳細)
単一行の内容:
表1:
CF1
- COL1
- COL2
- ...
- col25
表2:
- CF1
- col1
- col2
- ..
- COL5
- CF2
- COL6
- COL7
- ..
- col25
私たちが行くクライアントを使用して実行されているベンチマーク。あなたは、行ごとのX細胞を取得している場合は
filter = bigtable.ChainFilters(bigtable.FamilyFilter(request.ColumnFamily),
bigtable.ColumnFilter(colPattern), bigtable.LatestNFilter(1))
tbl := bf.Client.Open(table)
rr := bigtable.NewRange(request.RowKeyStart, request.RowKeyEnd)
err = tbl.ReadRows(c, rr, func(row bigtable.Row) bool {return true}, bigtable.RowFilter(filter))
こんにちは@David、ご返信ありがとうございます。私は行の内容と実行しているクエリに関する詳細をいくつか追加して質問を更新しました。わかるように、私たちはFamilyFilterを実行します。私たちのベンチマークでは、** cf1 **にFamilyFilterを適用し、** col1 **と完全に一致するColumnFilterを実行して、** col1 **を取得しました。したがって、テーブル2では、FamilyFilterがデータを返すことが少ないため、クエリが高速になると予想します。この仮定は間違っていますか? – krelst