最近在做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啊。。。