2017-09-26 17 views
0

私は現在、他の人が使っているビューで2つのテーブルを照会しています。私はクエリを構築するにはいくつかの異なる方法を試しましたが、私が得られる最も良い時は値を返すのに10分から15分です。クエリは次のとおりです。1つのテーブルの列から2つの値をクエリし、別のテーブルに結合しますか?

SELECT a.unit_location_id, a.location_name, a.serial_number, a.unit_name, 
a.rating, b.max_number, c.min_number 

FROM details a 

JOIN (SELECT serial_number, setting_value AS max_number 
FROM settings WHERE setting_name = 'max number') b ON a.serial_number = b.serial_number 

JOIN (SELECT serial_number, setting_value AS min_number 
FROM settings WHERE setting_name = 'min number') c ON a.serial_number = c.serial_number 

WHERE b.max = c.min; 

質問を高速化できるか、何が欠けていますか?

+1

統計情報、分析、テーブル構造、インデックスをテーブルに用意することはできますか? –

+0

私は共有できる統計情報を得るために取り組んでいます。テーブルは2つの異なるスキームになっています。それらは同じ索引ではなく、serial_numberは新しい表の索引ですが、古い表の索引ではありません。これらは大きなテーブルで、詳細テーブルには30以上の列があります。設定は新しいデータベース設計を使用していますが、列数は少なく、各serial_numberには数百のレコードが使用されます。詳細クエリーが秒単位で返され(20未満)、設定は少し遅くなります(約1分)。それは、時間が10分を超えてしまうエラー(最大=最小)を探してテーブルを結合するときです。 – David

答えて

2

2つの結合の1つを削除することができれば、パフォーマンスがすぐに向上する可能性があります。単一の集計クエリを使用して、settingsテーブル内の各シリアル番号の最大値と最小値を実際に特定できることに感謝します。以下のクエリでは、detailsを1つのサブクエリに結合します。このサブクエリは最大値と最小値を検索します。

SELECT 
    a.unit_location_id, 
    a.location_name, 
    a.serial_number, 
    a.unit_name, 
    a.rating, 
    t.max_number, 
    t.min_number 
FROM details a 
INNER JOIN 
(
    SELECT 
     serial_number, 
     MAX(CASE WHEN setting_name = 'max number' THEN setting_value END) AS max_number, 
     MAX(CASE WHEN setting_name = 'min number' THEN setting_value END) AS min_number 
    FROM settings 
    GROUP BY serial_number 
) t 
    ON a.serial_number = t.serial_number 
WHERE 
    t.max_number = t.min_number; 
+0

私はその事件については考えていませんでした。ありがとうございました。 – David

関連する問題