oracle資料庫:耗cpu sql語句優化
教一個朋友學習oracle執行計劃如何選擇執行路徑
用如下語句查詢耗CPU最多的10條語句
select * from
(select
s.SQL_ID,
sum(s.CPU_TIME_DELTA),
sum(s.DISK_READS_DELTA),
count(*)
from DBA_HIST_SQLSTAT s
group by s.SQL_ID
order by sum(s.CPU_TIME_DELTA) desc
)
where rownum < 11
SQL_ID SUM(S.CPU_TIME_DELTA) SUM(S.DISK_READS_DELTA) COUNT(*)
------------- --------------------- ----------------------- ----------
fb9s6t3xm9tvr 2759607595 2 182
85j0bu1w40bck 585125959 125790 197
bdtayq9gqwgcd 512783029 2760 259
5jqycjn6350yf 469531232 222602 15
b6usrg82hwsa3 441894821 3900754 11
ab1a9mnnx09tz 357513338 5335765 16
ct6ghwmxspjr6 323975234 4460761 8
bwgq25s4b8fhn 293460407 8266772 13
cdhvvs3scp62k 268952962 9675 275
4aq1jam9gr5t0 268676518 20 13
10 rows selected
已sql-id='fb9s6t3xm9tvr '查詢sql文字:
SQL> select sql_text from DBA_HIST_SQLTEXT where sql_id='fb9s6t3xm9tvr';
SQL_TEXT
--------------------------------------------------------------------------------
Select Command_SEQ,Command_Type,Parm_Info,App_Info From T_Java2C_Command Where S
tatus = '0'
檢視sql語句的執行計劃:
SQL> explain plan for Select Command_SEQ,Command_Type,Parm_Info,App_Info From T_Java2C_Command Where status=’0‘;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4203371258
--------------------------------------------------------------------------------
------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 24957 | 584K| 140 (2)| 00:0
0:02 |
|* 1 | TABLE ACCESS FULL| T_JAVA2C_COMMAND | 24957 | 584K| 140 (2)| 00:0
0:02 |
--------------------------------------------------------------------------------
------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(("STATUS")=0)
Note
-----
- 'PLAN_TABLE' is old version
17 rows selected.
我們看到oracle走了全表掃描。接下來看看錶'T_JAVA2C_COMMAND'是否建立了索引;
SQL> select OWNER,INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME from dba_indexes where TABLE_NAME='T_JAVA2C_COMMAND';
看到表沒有建立索引。我們給表建立索引。
SQL> create index ind_T_Java2C_Com on T_Java2C_Command(status) nologging;
Index created.
現在查詢索引情況:
SQL> select OWNER,INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME from dba_indexes where TABLE_NAME='T_JAVA2C_COMMAND';
OWNER INDEX_NAME
------------------------------ ------------------------------
INDEX_TYPE TABLE_OWNER
--------------------------- ------------------------------
TABLE_NAME
------------------------------
BJHQMSS IND_T_JAVA2C_COM
NORMAL BJHQMSS
T_JAVA2C_COMMAND
在查詢oracle執行計劃情況。
SQL> explain plan for Select Command_SEQ,Command_Type,Parm_Info,App_Info From T_Java2C_Command Where status='0';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1521489106
--------------------------------------------------------------------------------
----------------
| Id | Operation | Name | Rows | Bytes | Cost (%
CPU)| Time |
--------------------------------------------------------------------------------
----------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 96 | 2
(0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_JAVA2C_COMMAND | 4 | 96 | 2
(0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_T_JAVA2C_COM | 4 | | 1
(0)| 00:00:01 |
--------------------------------------------------------------------------------
----------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("STATUS"='0')
Note
-----
- 'PLAN_TABLE' is old version
18 rows selected.
我們看到cpu成本從140降低2.oracle好智慧啊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28985005/viewspace-764378/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- 【資料庫】SQL語句資料庫SQL
- 【資料庫】優化SQL語言資料庫優化SQL
- SQL語句優化SQL優化
- Oracle資料庫語句大全Oracle資料庫
- oracle資料庫常用語句Oracle資料庫
- 1.4 資料庫和常用SQL語句(正文)——MySQL資料庫命令和SQL語句資料庫MySql
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- 資料庫查詢優化:使用explain分析sql語句執行效率資料庫優化AISQL
- MYSQL SQL語句優化MySql優化
- sql語句效能優化SQL優化
- 如何快速定位當前資料庫消耗 CPU 最高的 sql 語句?資料庫SQL
- Oracle效能優化-資料庫CPU使用率100%Oracle優化資料庫
- 資料庫最佳化技巧 - SQL語句最佳化資料庫SQL
- 資料庫常用操作SQL語句資料庫SQL
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- 資料庫常用的sql語句大全--sql資料庫SQL
- 資料庫優化 - SQL優化資料庫優化SQL
- MySQL之SQL語句優化MySql優化
- [20201210]sql語句優化.txtSQL優化
- 資料庫優化SQL資料庫優化SQL
- SQL語句在oracle資料庫中的初級應用(上)SQLOracle資料庫
- oracle-資料庫- insert 插入語句Oracle資料庫
- 優化 SQL 語句的步驟優化SQL
- Oracle基本SQL語句OracleSQL
- sql 正則替換資料庫語句!SQL資料庫
- 資料庫常用的sql語句彙總資料庫SQL
- GaussDB資料庫SQL系列-動態語句資料庫SQL
- MYSQL資料庫------SQL優化MySql資料庫優化
- idea內建資料庫 + sql語句庫表操作Idea資料庫SQL
- Oracle OCP(01):使用SQL SELECT語句檢索資料OracleSQL
- [20200320]SQL語句優化的困惑.txtSQL優化
- mysql資料庫sql語句基礎知識MySql資料庫
- MySQL資料庫中SQL語句分幾類?MySql資料庫
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- SQL查詢語句 (Oracle)SQLOracle
- Oracle SQL精妙SQL語句講解OracleSQL
- MySQL 資料庫與 SQL 優化MySql資料庫優化
- 恢復Oracle資料庫誤刪除資料的語句Oracle資料庫