這一陣子在作一個查詢交易的壓力測試,使用的AIX+informix數據庫。應用和數據庫分別部署在兩臺機器上。使用loadrunner進行併發測試。相關錶的歷史數據是20W級別的。使用20個併發進行測試。數據庫
測試過程當中,應用服務器負載正常,數據庫服務器磁盤、網絡使用率正常,可是CPU使用率倒是98%左右。以爲很奇怪,由於這臺機器是測試環境中性能最好的,表現不該該如此。因而先猜想會不會是informix的參數配置不對,因而搜了些informix參數中影響CPU使用率的參數調了一遍,可是現象依舊。對裏面查詢的三張主表的SQL語句使用執行計劃查看,查詢也沒有問題,都落在索引上了。直到前兩天看到一篇文章,裏面提到若是不肯定哪段代碼致使的性能問題,能夠使用分段註釋代碼的方法定位是哪全代碼的問題,因而也想能夠把這個查詢交易裏面查詢的全部表的SQL語句註釋掉查找是操做哪張表裏致使的。最後終於定位到是在查詢另一張數據量比較大的表時,在導數據的腳本中把一個索引給刪了,致使走了另外一個低效率的索引。如下是查詢計劃的部份內容:服務器
QUERY: (OPTIMIZATION TIMESTAMP: 02-12-2015 14:33:42)
------
SELECT col1,col2 FROM table1 where card_no='card0002456' and status='0'網絡
Estimated Cost: 12456
Estimated # of Rows Returned: 2併發
1) table1: INDEX PATHide
Filters: table1.status= '0'性能
(1) Index Name: 413_1682
Index Keys: cust_no card_no agent_no product (Key-First) (Serial, fragments: ALL)
Index Key Filters: (table1.card_no = 'fund_card0002456' )測試
Query statistics:
-----------------orm
Table map :
----------------------------
Internal name Table name
----------------------------
t1 table1索引
type table rows_prod est_rows rows_scan time est_cost
-------------------------------------------------------------------
scan t1 1 2 200000 00:00.58 12456資源
能夠看到雖然使用的是「INDEX PATH」,可是下面rows_scan是200000,這張表的數據量就是200000,那也就是全表掃描了。後來在yw_zhzj這張表中加上缺失的fund_card字段上的索引,數據庫CPU使用率立馬降到5%如下了。
猛然想起以前看到的一句話:數據庫CPU使用率異常高,頗有多是某個大表在做全表掃描。惋惜當時經驗尚淺,仍舊一頭扎到informix的參數調整裏去了。如今回頭看,總結兩點:
1,CPU使用率高,但其餘資源使用率正常,那絕對先考慮有數據量較大的表在做全表掃描。
2,方向很重要
3,註釋法是個定位問題的殺手鐗