SQL優化] 避免在WHERE子句中對列使用函式
前兩天在系統的TOP SQL LIST中發現有這樣一條SQL,拿了出來分析了一下。發現這條SQL的WHERE條件中對列使用了函式,這樣會影響SQL效能。由於簡單改寫了一下效能大有好轉。詳細如下
原SQL
SQL> select contract_idntfr,plan_code,process_date,cvrg_idntfr
2 from PRODUSRTB.ffuactmthmv
3 where to_char(ac_ymth,'yyyymm') ='200704'
4 and (event in ('ContractSurrender','ContractLapseProcessing','StartPremiumHoliday') or
5 (event = 'ContractStatusChange' and after_value = 'PremiumHoliday'))
6* and PRODUSR.get_pol_ymth_area(contract_idntfr,'200704') between '001001000000000000000' and '001001000999999999999'
5261 rows selected.
Elapsed: 00:01:29.17
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13059 Card=4 Bytes=2
64)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'FFUACTMTHMV' (Cost=13059
Card=4 Bytes=264)
2 1 BITMAP CONVERSION (TO ROWIDS)
3 2 BITMAP OR
4 3 BITMAP CONVERSION (FROM ROWIDS)
5 4 INDEX (RANGE SCAN) OF 'IDX_FFUACTMTHMV_EVENT' (NON
-UNIQUE) (Cost=344)
6 3 BITMAP CONVERSION (FROM ROWIDS)
7 6 INDEX (RANGE SCAN) OF 'IDX_FFUACTMTHMV_EVENT' (NON
-UNIQUE) (Cost=344)
8 3 BITMAP CONVERSION (FROM ROWIDS)
9 8 INDEX (RANGE SCAN) OF 'IDX_FFUACTMTHMV_EVENT' (NON
-UNIQUE) (Cost=344)
10 3 BITMAP CONVERSION (FROM ROWIDS)
11 10 INDEX (RANGE SCAN) OF 'IDX_FFUACTMTHMV_EVENT' (NON
-UNIQUE) (Cost=344)
Statistics
----------------------------------------------------------
20915 recursive calls
0 db block gets
378354 consistent gets
9064 physical reads
1100 redo size
148545 bytes sent via SQL*Net to client
4505 bytes received via SQL*Net from client
352 SQL*Net roundtrips to/from client
20908 sorts (memory)
0 sorts (disk)
5261 rows processed
修改後SQL
SQL> select contract_idntfr,plan_code,process_date,cvrg_idntfr
2 from PRODUSRTB.ffuactmthmv
3 where ac_ymth between to_date('2007040100:00:00') and to_date('2007043023:59:00') /*或者使用大於,小於*/
4 and (event in ('ContractSurrender','ContractLapseProcessing','StartPremiumHoliday') or
5 (event = 'ContractStatusChange' and after_value = 'PremiumHoliday'))
6 and PRODUSR.get_pol_ymth_area(contract_idntfr,'200704') between '001001000000000000000' and '001001000999999999999'
7 ;
5261 rows selected.
Elapsed: 00:00:06.40
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2066 Card=9 Bytes=59
4)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'FFUACTMTHMV' (Cost=2066
Card=9 Bytes=594)
2 1 INDEX (RANGE SCAN) OF 'IDX_FFUACTMTHMV_YMTH' (NON-UNIQUE
) (Cost=447 Card=134802)
Statistics
----------------------------------------------------------
20908 recursive calls
0 db block gets
296607 consistent gets
0 physical reads
1040 redo size
148515 bytes sent via SQL*Net to client
4505 bytes received via SQL*Net from client
352 SQL*Net roundtrips to/from client
20908 sorts (memory)
0 sorts (disk)
5261 rows processed
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7364032/viewspace-17463/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL優化中索引列使用函式之靈異事件SQL優化索引函式事件
- [20180928]避免表示式在sql語句中.txtSQL
- 關於在SQL語句中ON和WHERE中條件使用的差異SQL
- 子查詢包含where ..or在Corelated Subquery 中語句中問題
- SQL優化--函式索引SQL優化函式索引
- [20181029]避免表示式在sql語句中(10g).txtSQL
- sql語句中where一定要放在group by 之前SQL
- 總結SQL語句中的優化提示SQL優化
- 避免SQL中的函式呼叫SQL函式
- 避免在WHERE條件中,在索引列上進行計算或使用函式,因為這將導致索引不被使用索引函式
- 2.在select語句中使用函式(筆記)函式筆記
- [20181030]避免表示式在sql語句中(10g)(補充).txtSQL
- 避免對mod函式的呼叫函式
- sql優化之多列索引的使用SQL優化索引
- SQL中 where 子句和having子句中的區別SQL
- Python 提取出SQL語句中Where的值的方法PythonSQL
- SQL最佳化中索引列使用函式之靈異事件SQL索引函式事件
- SQL語句中聚合函式忽略NULL值的總結SQL函式Null
- SQL優化案例-自定義函式索引(五)SQL優化函式索引
- numpy.where()函式函式
- MyBatis的使用三(在sql語句中傳值)MyBatisSQL
- SQL Server SQL語句中的函式呼叫與Oracle SQL語句函式呼叫一個有趣的差別SQLServer函式Oracle
- 如何使用函式來優化效能函式優化
- SQL語句中 left join 後用 on 還是 where,區別大SQL
- java效能優化方案2——避免使用正規表示式Java優化
- SQL Server 聚合函式演算法優化技巧SQLServer函式演算法優化
- 在EM中使用SQL Tuning Advisor(SQL優化建議)優化SQLSQL優化
- sql優化用group by 函式代替分析函式SQL優化函式
- 在 Sql語句中使用正規表示式來查詢你所要的字元SQL字元
- Excel 優化函式Excel優化函式
- SQL 優先順序join>whereSQL
- sql語句中JOIN ON 的使用SQL
- 高效的SQL(函式索引優化VIEW一例)SQL函式索引優化View
- Spark Sql 函式使用SparkSQL函式
- 在sql語句中替換Not In 的方法SQL
- 【SQL】使用分析函式與關聯子查詢的比較SQL函式
- JVM鉤子函式的使用JVM函式
- 對自定義函式使用不當的調優案例函式