最近在做hadoop叢集的容量資料,主要依據zabbix的監控資料,因為要計算impala的記憶體使用情況,就使用了下面的sql

select a.host,avg(b.value) from
(select a.host,b.itemid,b.key_ from hosts a,items b where
a.hostid=b.hostid and a.host like `%hadoop-datanode%` and b.key_=`impala.get[mem]`)a
join
(select itemid,clock,value from history) b on a.itemid=b.itemid
and b.clock between unix_timestamp(`2014-02-28 00:00:00`) and
unix_timestamp(`2014-03-06 00:00:00`) group by a.host;

在使用explain時發現巨慢,一個生成執行計劃的操作都這麼慢?

考慮到sql的效能優化,就把上面的查詢寫成了3個表的join:

select
a.host,avg(c.value) from hosts a,items b,history c where
a.hostid=b.hostid and a.host like `%hadoop-datanode%` and
b.key_=`impala.get[mem]`
and
b.itemid=c.itemid and c.clock between
unix_timestamp(`2014-02-28 00:00:00`) and unix_timestamp(`2014-03-06 00:00:00`) group by a.host;

這樣效能就好多了。。

其實這是explain的一個bug,在使用subquery時,explain會在後臺執行這個sql,這樣explain的時間就差不多是sql執行的時間了。。。

看來自己的sql寫得太爛了,以後還是要多多的explain啊。。。