1

ヒストグラムを生成するクエリに関して、誰かが私にアドバイスをしてくれるかどうか疑問に思っていました。(動作するという点で) 気に入っているクエリがありますが、非常に遅いです。背景は次のとおりです。

メタデータのテーブル、meta_data の 1 行が data_values の多数 (おそらく数千行) のキー行であるデータ値のテーブル、およびヒストグラム ビン情報のテーブルがあります。

create table meta_data (
    id int not null primary key, 
    name varchar(100), 
    other_data char(10)
);
create table data_values (
    id int not null primary key, 
    meta_data_id int not null, 
    data_value real
);
create table histogram_bins (
    id int not null primary key,
    bin_min real,
    bin_max real,
    bin_center real,
    bin_size real
);

そして、ヒストグラムを作成するクエリ:

SELECT md.name AS `Name`, 
       md.other_data AS `OtherData`, 
       hist.bin_center AS `Bin`, 
       SUM(data.data_value BETWEEN hist.bin_min AND hist.bin_max) AS `Frequency`
FROM   histogram_bins hist 
       LEFT JOIN data_values data ON 1 = 1 
       LEFT JOIN meta_data md ON md.id = data.meta_data_id

GROUP BY md.id, `Bin`;

このクエリの以前のバージョンでは、BETWEEN ... AND 論理ステートメントが JOIN でダウンしていました (1 = 1 を置き換えます) が、0 以外の頻度のヒストグラム行しか受信しませんでした。分析のために、すべてのビン (頻度がゼロのビンも含む) の行が必要です。

かなり遅く、10〜15分程度です。data_values テーブルには約 790 万行があり、meta_data は 15,900 行あります。つまり、長い時間がかかる可能性があります。

どうもありがとう!

4

1 に答える 1

0

私はこれが役立つかもしれないと思う

SELECT h.bin_center AS `Bin`, 
   ISNULL(F.Frequency,0) AS `Frequency`
FROM  histogram_bins h
LEFT JOIN 
   (SELECT hist.bin_center AS `Bin`, 
           COUNT(data_values) AS `Frequency`
    FROM data_values  data
    LEFT JOIN histogram_bins hist ON data.data_value BETWEEN hist.bin_min AND hist.bin_max        
    GROUP BY md.name, md.other_data, hist.bin_center) F ON F.bin_center = h.bin_center

データ内のすべてのレコードに対応するビンを見つけてから、ビンごとにグループ化された数をカウントするのが最善だと思うので、テーブルの順序を変更しました

于 2012-08-18T02:42:20.763 に答える