2017-09-26 82 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

相关问题