2017-09-28 16 views
3

現在、私たちはビッグテーブルクエリのパフォーマンスに複数列ファミリを使用することの影響を調査中です。列を複数の列ファミリに分割してもパフォーマンスは向上しません。誰も似たような経験をしていますか?ビッグテーブルのパフォーマンス影響列ファミリ

ベンチマークの設定についてさらに詳しく説明します。現時点では、本番表の各行に約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呼び出しで必要な情報だけを取得することができます。

我々の調査結果についての説明をお持ちの方?

benchmark results


(編集:追加いくつかの詳細)

単一行の内容:

表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)) 

答えて

0

が、それはこれらの細胞は、XとX別の列の家族連れや1列ファミリーであるかどうかの主要なパフォーマンスの違いはありません。次のようにAPIを呼び出すコードは、基本的に見えます列修飾子。

だけ実際にいくつかの特定の目的を持っていた行のセルが必要な場合は、パフォーマンスの違いがでてくる - ことができます

filter on the ReadRow callを指定して)行のすべてのセルを選択し、代わりにただ1人の列の家族をフェッチ回避

さらに重要な要素は、単にデータを正確に記述するスキーマを選択することです。これを行うと、上記のタイプのゲインが自然に得られます。また、100コラムの家族の推奨限度額に達するのを避けます。

たとえば、あなたがリーダーボードソフトウェアを書いているとし、プレーヤーが各ゲームでヒットしたスコアといくつかの個人情報を保存するとします。あなたのスキーマは次のようになります。キー

  • 行:
  • 列ファミリー
    • 列予選FULL_NAME
    • 列予選 USER_INFO password_hash
  • 列ファミリーgame_scores
    • 列予選candy_royale
    • 列予選clash_of_tanks game_scores列ファミリー内の別の列として格納されたそれぞれのゲームを持って

は、すべての項目を見ることができますuser_infoも取得せずにユーザを一度に取得できるようにするには、列ファミリを管理し、各ゲームの独立したスコアの時系列を可能にし、データの性質を反映したその他の利点を提供します。

+1

こんにちは@David、ご返信ありがとうございます。私は行の内容と実行しているクエリに関する詳細をいくつか追加して質問を更新しました。わかるように、私たちはFamilyFilterを実行します。私たちのベンチマークでは、** cf1 **にFamilyFilterを適用し、** col1 **と完全に一致するColumnFilterを実行して、** col1 **を取得しました。したがって、テーブル2では、FamilyFilterがデータを返すことが少ないため、クエリが高速になると予想します。この仮定は間違っていますか? – krelst

関連する問題