SQL限制條件應儘量避免使用SYSDATE
如果可以明確的使用日期常量來表示,那麼就儘量避免使用SYSDATE作為替代。以前寫過一篇SQL中如何處理常量的,其實已經包含了這個含義。
sql語句中常量的處理:http://yangtingkun.itpub.net/post/468/20038
有時候出於偷懶的目的,有些人習慣在應該輸入常量的地方使用類似SYSDATE的函式來代替,但是這會帶來額外的效能代價:
[oracle@yans1 ~]$ sqlplus test/test
SQL*Plus: Release 10.2.0.3.0 - Production on 星期二 7月 14 10:00:52 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> set pages 100 lines 120
SQL> create table t (id number, name varchar2(30), created date);
Table created.
SQL> insert into t select rownum, object_name, created from dba_objects;
70739 rows created.
SQL> insert into t select * from t;
70739 rows created.
SQL> insert into t select * from t;
141478 rows created.
SQL> insert into t select * from t;
282956 rows created.
SQL> insert into t select * from t;
565912 rows created.
SQL> insert into t select * from t;
1131824 rows created.
SQL> insert into t select * from t;
2263648 rows created.
SQL> insert into t select * from t;
4527296 rows created.
SQL> commit;
Commit complete.
SQL> set timing on
SQL> select count(*) from t where created >= to_date('2009-1-1', 'yyyy-mm-dd');
COUNT(*)
----------
744960
Elapsed: 00:00:00.56
SQL> select count(*) from t where created >= to_date('2009-1-1', 'yyyy-mm-dd');
COUNT(*)
----------
744960
Elapsed: 00:00:00.40
SQL> select count(*) from t where created >= trunc(sysdate, 'yyyy');
COUNT(*)
----------
744960
Elapsed: 00:00:01.58
SQL> select count(*) from t where created >= trunc(sysdate, 'yyyy');
COUNT(*)
----------
744960
Elapsed: 00:00:01.54
上面兩個SQL等價,但是使用常量方式所需的執行時間,僅是使用SYSDATE函式的1/3左右。這時由於對於常量的計算,Oracle只需要在執行前執行一次得到結果就可以了,但是對於SYSDATE函式,則需要在與每條記錄進行比較的時候都進行呼叫。
不僅僅是SYSDATE函式,其他函式也是一樣的道理。應該只是在需要的時候進行呼叫:
SQL> select count(*) from t where name = 'TEST';
COUNT(*)
----------
768
Elapsed: 00:00:00.32
SQL> select count(*) from t where name = 'TEST';
COUNT(*)
----------
768
Elapsed: 00:00:00.31
SQL> select count(*) from t where name = user;
COUNT(*)
----------
768
Elapsed: 00:00:00.58
SQL> select count(*) from t where name = user;
COUNT(*)
----------
768
Elapsed: 00:00:00.57
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-609180/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL限制條件應儘量避免使用SYSDATE(二)SQL
- 使用 XML 時儘量避免使用的技術XML
- 儘量使用簡單的sqlSQL
- 面試官:如何在開發階段就儘量避免寫出慢 SQL ?面試SQL
- 總結在SQL Server檢視管理中限制條件SQLServer
- SQL Server檢視管理中的四個限制條件SQLServer
- PLSQL Language Reference-PL/SQL語言基礎-條件編譯-條件編譯指令限制SQL編譯
- SQL Server檢視管理中需要遵守的四個限制條件SQLServer
- PL/SQL 條件SQL
- 儘量使用 useReducer,不要使用 useStateuseReducer
- 高效的SQL(index skip scan使用條件)SQLIndex
- 儘量用簡單的SQL替代PL/SQL邏輯SQL
- 報表任務眾多……下週要儘量避免天天加班 ◎◎
- SQL中on條件與where條件的區別[轉]SQL
- [AlwaysOn] 建立SQL Server高可用性組T-SQL語法:先決條件和限制SQLServer
- SQL多條件查詢SQL
- oracle表空間傳輸的限制條件Oracle
- Oracle中left join中右表的限制條件Oracle
- 【ORACLE】物化檢視快速重新整理限制條件Oracle
- MySQL版本對varchar的定義和限制條件MySql
- PL/SQL 條件控制語句SQL
- sql 查詢條件問題SQL
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- 條件限制性進入某個程式流程的限制演算法演算法
- FORM 10g的限制查詢條件引數ORM
- 通過新增條件優化SQL優化SQL
- 查詢作為條件的SQLSQL
- 動態SQL-條件分頁SQL
- Oracle 是分割槽表,但條件不帶分割槽條件的SQLOracleSQL
- OLTP系統中儘量使用繫結變數變數
- LINQ系列:LINQ to SQL Where條件SQL
- SQL SERVER 條件語句的查詢SQLServer
- 無合適where條件過濾時儘量選擇order by後的欄位以驅動表進行查詢薦
- 《Oracle EXP工具QUERY引數使用方法和限制條件》-使用場景-對比測試-可下載Oracle
- 關於在SQL語句中ON和WHERE中條件使用的差異SQL
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- 使用channel代替條件變數變數
- SQL Server 按照條件統計雨量資料SQLServer