2017-09-26 127 views
0

我目前在其他人使用的視圖中查詢兩個表。我已經嘗試了幾種不同的方式來構建查詢,但我得到的最佳時間是10到15分鐘之間以返回值。查詢是:從一個表的列中查詢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

我正在努力獲取我可以共享的統計信息這些表格有兩種不同的方案。它們的索引不相同,並且serial_number是較新表的索引,但不是舊錶的索引。這些是大表,細節表有30多列。設置使用的是較新的數據庫設計,列數較少但每個serial_number數百條記錄。細節查詢以秒爲單位返回(小於20),設置稍慢(大約1分鐘)。只是當我加入尋找錯誤的表格(最大值=最小值)時,時間超過10分鐘。 – David

回答

2

如果你能消除這兩個連接中的一個,那麼可以立即明顯改善性能。請注意,我們實際上可以通過使用單個聚合查詢來識別settings表中每個序列號的最大和最小數字。在下面的查詢中,我將details加入到查找最大和最小數字的單個子查詢中。

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

我沒有考慮CASE WHEN,謝謝幫助一些,但設置表我只是要大。 – David

相關問題