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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 XML 時儘量避免使用的技術XML
- 【SQL】SQL中if條件的使用SQL
- 儘量避免無知者無畏
- Sql中SYSDATE函式的使用方法SQL函式
- 面試官:如何在開發階段就儘量避免寫出慢 SQL ?面試SQL
- sql 使用變數帶入in條件SQL變數
- PL/SQL 條件SQL
- [AlwaysOn] 建立SQL Server高可用性組T-SQL語法:先決條件和限制SQLServer
- 條件變數如何避免丟失通知變數
- 儘量使用 useReducer,不要使用 useStateuseReducer
- PL/SQL 條件控制語句SQL
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- 條款02: 儘量以const,enum,inline 替換 #defineinline
- Oracle中left join中右表的限制條件Oracle
- 動態SQL-條件分頁SQL
- 通過新增條件優化SQL優化SQL
- SQL-基礎語法 - 條件分支SQL
- 不要輕易在sql中使用uint64 uint做條件引數SQLUI
- 使用pv命令限制SQL文字匯入速度SQL
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- Mysql系列第七講 玩轉select條件查詢,避免採坑MySql
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- 銀彈谷零程式碼軟體開發套件原生SQL中in條件使用套件SQL
- T-SQL——關於Join on的的連線條件和where的篩選條件的區分SQL
- Exchange限制郵箱使用者每天/每分鐘的傳送郵件數量和速率
- 每個鎖建立多個條件佇列以避免虛假喚醒佇列
- Excel教程——excel如何使用條件格式Excel
- 關聯條件的業務使用
- impdp自動建立使用者前提條件與應用場景
- SAP ABAP DDIC 結構欄位的一些技術限制條件
- SQL-基礎語法 - 條件查詢 - 模糊查詢SQL
- 採用分片技術(Sharding)應對SQL Azure限制JDSQL
- Java 設定Excel條件格式(高亮條件值、應用單元格值/公式/資料條等型別)JavaExcel公式型別
- php中條件語句的使用整理PHP
- 條件渲染
- mybatis條件判斷及動態sql的簡單擴充MyBatisSQL
- SQL-基礎語法 - 條件查詢 - 邏輯運算SQL
- IDC資料中心應具備如下基本條件
- Go的條件判斷語句的使用Go