[20131204]sql語句優化.txt
[20131204]sql語句優化.txt
昨天優化sql語句,遇到一些細節問題,做一個記錄:
SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
create table t (id number,create_date date,pad varchar2(80));
create index i_t_create_date on t(create_date);
SCOTT@test> select /*+ index(t i_t_create_date) */ * from t where create_date>=trunc(sysdate) and create_date>sysdate - 6/1440;
no rows selected
SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 6tqcjs9bj623v, child number 0
-------------------------------------
select /*+ index(t i_t_create_date) */ * from t where
create_date>=trunc(sysdate) and create_date>sysdate - 6/1440
Plan hash value: 2174186695
-----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | Cost (%CPU)|
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 1 (100)|
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 1 (0)|
|* 2 | INDEX RANGE SCAN | I_T_CREATE_DATE | 1 | 1 (0)|
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CREATE_DATE">=TRUNC(SYSDATE@!))
filter("CREATE_DATE">SYSDATE@!-.004166666666666666666666666666666
666666667)
SCOTT@test> select /*+ index(t i_t_create_date) */ * from t where create_date>sysdate - 6/1440 and create_date>=trunc(sysdate);
no rows selected
SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID fcc58jafh38ym, child number 0
-------------------------------------
select /*+ index(t i_t_create_date) */ * from t where
create_date>sysdate - 6/1440 and create_date>=trunc(sysdate)
Plan hash value: 2174186695
-----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | Cost (%CPU)|
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 1 (100)|
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 1 (0)|
|* 2 | INDEX RANGE SCAN | I_T_CREATE_DATE | 1 | 1 (0)|
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CREATE_DATE">SYSDATE@!-.004166666666666666666666666666666
666666667)
filter("CREATE_DATE">=TRUNC(SYSDATE@!))
-- 先是感覺奇怪的是兩者寫法,為什麼access的條件不一樣。開始感覺第2種寫法應該快一些,正常的業務這樣掃描的日期範圍窄一些。
-- oracle優化器應該能作出正確的選擇,後來想起來以前遇到的問題,我給它起一個名字叫"零點魔鬼",在凌晨切換日期時
-- 程式就有問題了。
SELECT trunc(to_date('2013-12-05 00:01:01','yyyy-mm-dd hh24:mi:ss')) a1,
to_date('2013-12-05 00:01:01','yyyy-mm-dd hh24:mi:ss') a2,
to_date('2013-12-05 00:01:01','yyyy-mm-dd hh24:mi:ss') -8/1440 a3
FROM dual ;
A1 A2 A3
------------------- ------------------- -------------------
2013-12-05 00:00:00 2013-12-05 00:01:01 2013-12-04 23:53:01
-- 很明顯在凌晨執行時,日期範圍越來越小,到0點6分後業務在正常。
-- 修改很簡單,刪除 create_date>=trunc(sysdate)條件。
昨天優化sql語句,遇到一些細節問題,做一個記錄:
SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
create table t (id number,create_date date,pad varchar2(80));
create index i_t_create_date on t(create_date);
SCOTT@test> select /*+ index(t i_t_create_date) */ * from t where create_date>=trunc(sysdate) and create_date>sysdate - 6/1440;
no rows selected
SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 6tqcjs9bj623v, child number 0
-------------------------------------
select /*+ index(t i_t_create_date) */ * from t where
create_date>=trunc(sysdate) and create_date>sysdate - 6/1440
Plan hash value: 2174186695
-----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | Cost (%CPU)|
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 1 (100)|
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 1 (0)|
|* 2 | INDEX RANGE SCAN | I_T_CREATE_DATE | 1 | 1 (0)|
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CREATE_DATE">=TRUNC(SYSDATE@!))
filter("CREATE_DATE">SYSDATE@!-.004166666666666666666666666666666
666666667)
SCOTT@test> select /*+ index(t i_t_create_date) */ * from t where create_date>sysdate - 6/1440 and create_date>=trunc(sysdate);
no rows selected
SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID fcc58jafh38ym, child number 0
-------------------------------------
select /*+ index(t i_t_create_date) */ * from t where
create_date>sysdate - 6/1440 and create_date>=trunc(sysdate)
Plan hash value: 2174186695
-----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | Cost (%CPU)|
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 1 (100)|
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 1 (0)|
|* 2 | INDEX RANGE SCAN | I_T_CREATE_DATE | 1 | 1 (0)|
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CREATE_DATE">SYSDATE@!-.004166666666666666666666666666666
666666667)
filter("CREATE_DATE">=TRUNC(SYSDATE@!))
-- 先是感覺奇怪的是兩者寫法,為什麼access的條件不一樣。開始感覺第2種寫法應該快一些,正常的業務這樣掃描的日期範圍窄一些。
-- oracle優化器應該能作出正確的選擇,後來想起來以前遇到的問題,我給它起一個名字叫"零點魔鬼",在凌晨切換日期時
-- 程式就有問題了。
SELECT trunc(to_date('2013-12-05 00:01:01','yyyy-mm-dd hh24:mi:ss')) a1,
to_date('2013-12-05 00:01:01','yyyy-mm-dd hh24:mi:ss') a2,
to_date('2013-12-05 00:01:01','yyyy-mm-dd hh24:mi:ss') -8/1440 a3
FROM dual ;
A1 A2 A3
------------------- ------------------- -------------------
2013-12-05 00:00:00 2013-12-05 00:01:01 2013-12-04 23:53:01
-- 很明顯在凌晨執行時,日期範圍越來越小,到0點6分後業務在正常。
-- 修改很簡單,刪除 create_date>=trunc(sysdate)條件。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-1062126/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL語句優化SQL優化
- SQL Server優化之SQL語句優化SQLServer優化
- [20151221]sql語句優化.txtSQL優化
- MYSQL SQL語句優化MySql優化
- sql語句效能優化SQL優化
- SQL語句的優化SQL優化
- 求助:SQL語句優化SQL優化
- [20201210]sql語句優化.txtSQL優化
- MySQL之SQL語句優化MySql優化
- SQL語句優化(轉載)SQL優化
- 常用SQL語句優化技巧SQL優化
- Oracle之sql語句優化OracleSQL優化
- SQL 語句的優化方法SQL優化
- 優化 SQL 語句的步驟優化SQL
- 一個SQL語句的優化SQL優化
- Oracle SQL語句優化之UNIONOracleSQL優化
- SQL語句操作符優化SQL優化
- 關於sql語句的優化SQL優化
- SQL語句優化技術分析SQL優化
- SQL語句優化方法30例SQL優化
- 一條sql語句的優化SQL優化
- sql語句的優化案例分析SQL優化
- [20181114]一條sql語句的優化.txtSQL優化
- [20131025]一條sql語句的優化.txtSQL優化
- [20151203]一條sql語句的優化.txtSQL優化
- [20150715]一條sql語句的優化.txtSQL優化
- [20120319]一條sql語句的優化.txtSQL優化
- [20130319]一條sql語句的優化.txtSQL優化
- 資料庫效能優化之SQL語句優化資料庫優化SQL
- 淺談mysql配置優化和sql語句優化MySql優化
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- 對sql語句的優化問題SQL優化
- oracle效能問題:sql語句優化OracleSQL優化
- SQL語句優化方法30例(轉)SQL優化
- SQL語句優化--十條經驗SQL優化
- 優化SQL 語句 in 和not in 的替代方案優化SQL
- ORACLE SQL語句優化技術分析OracleSQL優化
- 通過SQL PROFILE自動優化SQL語句SQL優化