生产记录数据约5万条,读写较为频繁,
产品部署环境是应用服务器与数据库局域网访问。
开发测试时,hibernate生成后的sql访问本机数据库1-2秒出查询结果,而访问远程数据库则不定期的出现2-4分钟之后才有返回。
单次请求为查询5000条左右数据并聚合,直接查询该5000条数据响应很快,聚合为30条的过程耗时明显不正常。
网上看了下,数据库已设置了禁用DNS解析,依然没解决问题。
大神看下是什么原因引起的?
6 个解决方案
#1
hibernate 查询,内部做过优化处理;建议添加适当索引,并使用 explain 对SQL语句进行简单分析和优化;
共享一下你的SQL查询脚本!
共享一下你的SQL查询脚本!
#2
SELECT
SUM(meadeliver0_.PDDO_RVOLUME) AS col_0_0_,
SUM(CASE meadeliver0_.COUNT_STATUS
WHEN 2 THEN 0.0
ELSE meadeliver0_.PDDO_ACCEPT
END) AS col_1_0_,
SUM(CASE meadeliver0_.CO_PUMP_FLG
WHEN 1 THEN meadeliver0_.PDDO_ACCEPT
ELSE 0.0
END) AS col_2_0_,
SUM(CASE meadeliver0_.CO_DEPLOY_FLG
WHEN 1 THEN meadeliver0_.PDDO_ACCEPT
ELSE 0.0
END) AS col_3_0_,
SUM(CASE meadeliver0_.CO_TRAIN_FLG
WHEN 1 THEN 1
ELSE 0
END) AS col_4_0_,
commonday1_.DAY_KEY AS col_5_0_
FROM
cts2_cc.mea_delivery_order meadeliver0_,
cts2_cc.common_day commonday1_,
cts2_cc.crm_order_form crmorderfo2_
WHERE
meadeliver0_.CO_ID=crmorderfo2_.CO_ID
AND commonday1_.DAY_START<=meadeliver0_.PDDO_ODATE
AND (
meadeliver0_.PDDO_TYPE IN (
0 , 1
)
)
AND (
meadeliver0_.PDDO_STATUS IN (
2 , 3
)
)
AND commonday1_.DAY_END>=meadeliver0_.PDDO_ODATE
AND crmorderfo2_.COMP_ID=27
AND meadeliver0_.PDDO_ODATE>='2013年07月25日 08:00:00'
AND meadeliver0_.PDDO_ODATE<='2013年08月25日 07:59:59'
GROUP BY
commonday1_.DAY_KEY
这是HQL转换之后的SQL,若仅去除所有sum和group by 返回5000行数据,响应时间1-2秒,加上聚合查询返回30条聚合结果,响应时间2-4分钟
#3
经查时间开销,300秒花费在了Copying to tmp table上。但是之前数据库优化了tmp_table_size = 128M,不明白为何会写到磁盘上。
#4
调整了下SQL,group by 调整为主键字段,发现避开了tmp table,
现在300秒开销到了Sending data,问题依然未解决
现在300秒开销到了Sending data,问题依然未解决
#5
三个表的索引情况呢
crmorderfo2_.COMP_ID=27 上加索引
meadeliver0_.PDDO_ODATE这个上加索引
crmorderfo2_.COMP_ID=27 上加索引
meadeliver0_.PDDO_ODATE这个上加索引
#6
meadeliver0_.PDDO_ODATE这个上加索引后速度明显提升,结帖
#1
hibernate 查询,内部做过优化处理;建议添加适当索引,并使用 explain 对SQL语句进行简单分析和优化;
共享一下你的SQL查询脚本!
共享一下你的SQL查询脚本!
#2
SELECT
SUM(meadeliver0_.PDDO_RVOLUME) AS col_0_0_,
SUM(CASE meadeliver0_.COUNT_STATUS
WHEN 2 THEN 0.0
ELSE meadeliver0_.PDDO_ACCEPT
END) AS col_1_0_,
SUM(CASE meadeliver0_.CO_PUMP_FLG
WHEN 1 THEN meadeliver0_.PDDO_ACCEPT
ELSE 0.0
END) AS col_2_0_,
SUM(CASE meadeliver0_.CO_DEPLOY_FLG
WHEN 1 THEN meadeliver0_.PDDO_ACCEPT
ELSE 0.0
END) AS col_3_0_,
SUM(CASE meadeliver0_.CO_TRAIN_FLG
WHEN 1 THEN 1
ELSE 0
END) AS col_4_0_,
commonday1_.DAY_KEY AS col_5_0_
FROM
cts2_cc.mea_delivery_order meadeliver0_,
cts2_cc.common_day commonday1_,
cts2_cc.crm_order_form crmorderfo2_
WHERE
meadeliver0_.CO_ID=crmorderfo2_.CO_ID
AND commonday1_.DAY_START<=meadeliver0_.PDDO_ODATE
AND (
meadeliver0_.PDDO_TYPE IN (
0 , 1
)
)
AND (
meadeliver0_.PDDO_STATUS IN (
2 , 3
)
)
AND commonday1_.DAY_END>=meadeliver0_.PDDO_ODATE
AND crmorderfo2_.COMP_ID=27
AND meadeliver0_.PDDO_ODATE>='2013年07月25日 08:00:00'
AND meadeliver0_.PDDO_ODATE<='2013年08月25日 07:59:59'
GROUP BY
commonday1_.DAY_KEY
这是HQL转换之后的SQL,若仅去除所有sum和group by 返回5000行数据,响应时间1-2秒,加上聚合查询返回30条聚合结果,响应时间2-4分钟
#3
经查时间开销,300秒花费在了Copying to tmp table上。但是之前数据库优化了tmp_table_size = 128M,不明白为何会写到磁盘上。
#4
调整了下SQL,group by 调整为主键字段,发现避开了tmp table,
现在300秒开销到了Sending data,问题依然未解决
现在300秒开销到了Sending data,问题依然未解决
#5
三个表的索引情况呢
crmorderfo2_.COMP_ID=27 上加索引
meadeliver0_.PDDO_ODATE这个上加索引
crmorderfo2_.COMP_ID=27 上加索引
meadeliver0_.PDDO_ODATE这个上加索引
#6
meadeliver0_.PDDO_ODATE这个上加索引后速度明显提升,结帖