0

行数が多すぎるデータベース テーブルがあります。パフォーマンスを高速化するために、要約テーブルを作成しようとしています。これは、1 対 1 の関係に最適です。たとえば、furnitureatypeと aがあるとします。manufacturer_idこれらの列と列の両方を持つテーブルを作成できcountsます。そのテーブルにクエリを実行して、特定のタイプの家具の数をすばやく取得するのは簡単です。

しかし、多対多の関係がある場合はどうなるでしょうか。そのため、各家具にも 1 つまたは複数のcolorsと 1 つまたは複数の を含めることができdistributorsます。その後どうなりますか?このデータを要約して、緑色の家具の数をすばやく見つける方法はありますか? または青と黄色はいくつですか?

明らかに、これは単なる作り話です。しかし、何百万もの行を持つ巨大なデータベース テーブルがある場合、集計情報をすばやく検索するために集計テーブルを作成するにはどうすればよいでしょうか?

4

4 に答える 4

1

自分が何をしているかを理解し、これが本当のボトルネックであることを知っていると仮定すると、パフォーマンスの測定値はありますか? どこから時間がかかり始めるか知っていますか?

その数を取得するには、とにかくデータベースにクエリを実行する必要があります。そのため、色数とディストリビューター数のように別のテーブルに保存できます。別の解決策は、これらのクエリの結果をキャッシュ システムにキャッシュすることです。たとえば、memcached やその他のツールが既に使用されている場合などです。

データベースを持っているだけの場合は、テーブルを作成するだけです。

table color count
color_id
amount

これは非常に単純なクエリです。非常に適切にインデックスを作成でき、結合は必要ありません。

更新は、トリガー、cron、または多対多のテーブルを更新する瞬間に行うことができます。あなたのニーズと能力に応じて。レコードの更新にも時間がかかることを考慮に入れて、読み取りの最適化に使用してください。それがあなたの質問で読んだことです。

于 2012-07-19T18:21:52.407 に答える
0

複数のテーブルはサイズを抑える必要があり、優れたデータベース システムはパフォーマンスを維持する必要があります。

私の意見では、別の「サマリー テーブル」を保持すると、多くのオーバーヘッドとメンテナンスの問題が発生し、同じサマリー情報が何度も必要な場合にのみ実際に役立ちます (つまり、いくつの家具が緑色で、いくつが青色かを保存せずに、黄色はいくつ、青と黄色はいくつ、などなど)

私がすることは次のとおりです。

表 1: 家具

  • 列 1: 一意の ID
  • 列 2: 名前

表 2: ディストリビューター

  • 列 1: 一意の ID
  • 列 2: 名前

表 3: 色

  • 列 1: 一意の ID
  • 列 2: 名前

表 4: 家具販売業者

  • 列 1: furnitureUniqueIDvalue
  • 列 2: distributionUniqueIDvalue

表 5: 家具の色

  • 列 1: furnitureUniqueIDvalue
  • 列 2: colorUniqueIDvalue

緑色の家具はいくつありますか:

SELECT COUNT(*) FROM furniture-color WHERE colorUniqueIDvalue = '緑の ID';

青と黄色の両方の家具はいくつありますか。

SELECT COUNT(*) FROM furniture-color as t1 INNER JOIN furniture-color as t1.furnitureUniqueIDvalue = t2.furnitureUniqueIDvalue AND t1.colorUniqueIDvalue = 'blue ID' AND t2.colorUniqueIDvalue = 'yellow ID';

青と黄色の家具の販売業者のリスト、または特定の販売業者からの緑または赤の家具、またはその他のほとんどの家具のリストを取得するには、適切な SQL ステートメントを使用できます (左は読者の課題として残しています)。

于 2012-07-19T18:21:43.307 に答える
0

さまざまな種類の家具 (個別の家具 ID) をカウントすることと、実際の家具をカウントすることを区別する必要があります。

ディストリビューターカラーのテーブルがある場合は、実際の家具を数えることができます。ただし、さまざまな種類の家具を数えることはできません。これは、OLAP の用語で言えば、加算ファクトと非加算ファクトの違いです。このテーマに興味がある場合は、Ralph Kimball と彼の古典的な本「The Data Warehouse Toolkit」を参照してください。

家具の種類を数えるには、それをテーブルに含める必要があります。したがって、ディストリビューターカラーの家具テーブルが必要です。ディストリビューターの合計を取得するには、次を使用できます。

select distributor, count(distinct furnitureid)
from dcf
group by distributor

色についても同様です。

レポートごとに、元のデータをファクト テーブルに変換したいようです。これは、データ マートを開発するための非常に優れた標準的なアイデアです。データ マートに 2 つのファクト テーブルを含めることができます。家具の種類ごとに 1 つ (製造に関する質問を簡単に処理できるようにするため) と、ディストリビューターの色の家具に関するもの (より難しい質問の場合) です。

Oracle や SQL Server などの一部のデータベースは、これらのタイプのデータ構造をサポートしています。あなたが話しているのは、単なる新しい「テーブル」ではなく、新しい「システム」のようなものです。ファクト テーブルのディメンション、更新、および必要なレポートの種類について考える必要があります。

于 2012-07-19T21:02:41.370 に答える
0

色の要約テーブルには2^nの行があり、'n' は色の数です。色をビットマップに縮小し、各色に場所 (赤 = 0、オレンジ = 1、黄 = 2、緑 = 3 など) を割り当てると、カラー サマリー テーブルは次のようになります。

Color    Count
0x0001   256
0x0002   345
0x0003   23839
etc.

256 は赤のみ、345 はオレンジのみ、23,839 は赤とオレンジです。赤を持っているが他の色を持っている可能性がある数を取得するには、ビット位置 0 を設定して行を合計する必要があります。別の方法として、行の合計を避けるために、各色に 1 つずつ、「n」個のエントリのみを含む別の集計テーブルを設定することもできます。

要約テーブルでディストリビューターと色の両方を管理する場合、複数の家具の複数のディストリビューターのすべての組み合わせを含めるには、2^n * 2^m行 (「m」はディストリビューターの数)になると思います。それぞれが複数の色を持つ可能性があります。

于 2012-07-25T05:49:09.847 に答える