我为我的一个客户开发了一种类似代码的招标管理系统。这是一段代码:
try {
Connection con = Mycon.getConnection();
PreparedStatement ps = con.prepareStatement("TRUNCATE tempcalcplan");
ps.executeUpdate();
ps.clearBatch();
ps = con.prepareStatement("INSERT INTO tempcalcplan SELECT v.conid,c.conname, v.rate, v.venid FROM venprices v LEFT JOIN country c ON c.conid = v.conid WHERE (v.conid, v.rate) IN ( SELECT v.conid, MIN(v.rate) FROM venprices v GROUP BY v.conid) GROUP BY v.conid");
ps.executeUpdate();
ps.clearBatch();
ps = con.prepareStatement("select * from tempcalcplan");
ResultSet rs = ps.executeQuery();
jTable1.setModel(DbUtils.resultSetToTableModel(rs));
} catch(Exception e){
e.printStackTrace();
}
这段代码被设计为:
- 清空表
tempcalcplan
(假设存储了以前的结果。) - 借助 2 个不同的表(表如下所示)生成所需的数据并将其存储在
tempcalcplan
表中 - 在 jTable 上显示
tempcalcplan
表的结果。
这是country
和tempcalcplan
表。
国家
(包含 30,000 条记录)+---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | conid | int(10) | NO | PRI | NULL | | | conname | varchar(50) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
tempcalcplan
(包含 1,80,000 多条记录)+---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | conid | int(10) | NO | PRI | NULL | | | conname | varchar(50) | YES | | NULL | | | rate | double | YES | | NULL | | | venid | varchar(50) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
venprices
+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | conid | int(10) | NO | PRI | NULL | | | rate | double | YES | | NULL | | | venid | varchar(50) | NO | PRI | | | +-------+--------------+------+-----+---------+-------+
结果最多需要 12-15 分钟才能显示在 jTable 中。 我想将它减少到 1-2 分钟。
最佳答案
这是可能花费最多时间的查询:
INSERT INTO tempcalcplan
SELECT v.conid, c.conname, v.rate, v.venid
FROM venprices v LEFT JOIN
country c
ON c.conid = v.conid
WHERE (v.conid, v.rate) IN ( SELECT v.conid, MIN(v.rate) FROM venprices v GROUP BY v.conid) GROUP BY v.conid");
我的猜测是 WHERE
子句导致了问题。尝试将其移至 FROM
子句:
SELECT v.conid, c.conname, v.rate, v.venid
FROM venprices v LEFT JOIN
country c
ON c.conid = v.conid JOIN
(SELECT v.conid, MIN(v.rate) as rate
FROM venprices v
GROUP BY v.conid
) vr
ON v.conid = vr.conid and v.rate = vr.rate;
我认为您的索引已针对此查询设置得很好。
关于java - 优化帮助 : SQL Query to display minimum prices per country,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659729/