SELECT T.xhrs, T.eq_id, mt.CATEGORY, mt.MODEL_NAME,
ROUND((SUM (T.TOT_AVAIL_TIME-T.maintenance_TIME) / SUM(T.TOT_AVAIL_TIME))*100) AVAILABILITY,
ROUND((SUM(UTIL_TIME) / nullif(SUM(T.TOT_AVAIL_TIME-T.maintenance_TIME ),0) )*100) UTILIZATION,
ROUND(SUM(T.failedcmds)/
SUM(T.total_failedcmds),2)*100 failedcmds,
AVG(MAX_QL) MAX_QL,
AVG(AVG_QL) avg_ql
FROM db1 T,
db2 mt
WHERE T.eq_model = mt.eq_model
and TOT_AVAIL_TIME != 0
AND TOT_AVAIL_TIME IS NOT NULL
GROUP BY T.xhrs, T.eq_id, mt.CATEGORY, mt.MODEL_NAME
此查询返回2550条记录,需要12-15秒才能在SQL Developer中运行,而在mybatis中则需要30-35秒。现有查询有什么问题吗?是否有任何方法可以优化上述查询并将执行时间降低到sql developer中的<5秒和ORM中的<15秒?
解释计划
答案 0 :(得分:1)
让我提出几点让我们考虑一下表现。
事实上,“MyBatis或任何其他ORM将比本机SQL执行慢”。这个事实的一些原因是:
话虽这么说,MyBatis可以为您提供灵活性,更好的维护,一种简单的方法来处理将表解析为Java对象的事务性,简单方法,但是您可以从中获得一些性能。
因此,如果您想加快查询速度,您应该考虑一些事项。见MyBatis Documentation:
<select ... useCache="false">
答案 1 :(得分:0)
在eq_model
列上添加索引并检查
请尝试使用此查询,我只会将TOT_AVAIL_TIM
SELECT T.xhrs, T.eq_id, mt.CATEGORY, mt.MODEL_NAME,
ROUND((SUM (T.TOT_AVAIL_TIME-T.maintenance_TIME) / SUM(T.TOT_AVAIL_TIME))*100) AVAILABILITY,
ROUND((SUM(UTIL_TIME) / nullif(SUM(T.TOT_AVAIL_TIME-T.maintenance_TIME ),0) )*100) UTILIZATION,
ROUND(SUM(T.failedcmds)/
SUM(T.total_failedcmds),2)*100 failedcmds,
AVG(MAX_QL) MAX_QL,
AVG(AVG_QL) avg_ql
FROM db1 T,
db2 mt
WHERE T.eq_model = mt.eq_model
AND (TOT_AVAIL_TIME != 0 AND TOT_AVAIL_TIME IS NOT NULL)
GROUP BY T.xhrs, T.eq_id, mt.CATEGORY, mt.MODEL_NAME
答案 2 :(得分:0)
如果表格尚未正确编入索引,您可以通过T
和TOT_AVAIL_TIME
以T.eq_model
为mt
编制索引mt.eq_model
}
答案 3 :(得分:0)
将T.eq_model
和T.TOT_AVAIL_TIME
放在一个索引中(按此顺序)。
注意:当您还检查TOT_AVAIL_TIME
的NULL-ness时,我认为它可以通过列定义为NULL。如果在简单索引中对其进行索引,则不会对NULL-s建立索引,并且TOT_AVAIL_TIME IS NOT NULL
以后不会使用该索引。因此,要么将其与eq_model
合并,要么删除该过滤器并将列更改为NOT NULL
。
我在JIRA上的可为空的列上使用了这种解决方法:(PROJECT_CAN_HAS_NULL ASC, '1')
。