Oracle數據庫SQL語句書寫注意

一、養成良好的變成習慣
語句1:select * From tb_shiyq;
語句2:select   * from tb_shiyq;
這三個語句乍一看是同樣的,可是高速緩存是不認的,是全字符匹配的,索引在高速緩存裏會存儲三條不一樣的語句,說到這裏,又引出一個習慣,就是要保持良好的編程習慣,這個很重要

二、FROM子句後面的表順序有講究
   ①ORACLE在解析sql語句的時候對FROM子句後面的表名是從右往左解析的,是先掃描最右邊的表,而後在掃描左邊的表,而後用左邊的表匹配數據,匹配成功後就合併。
     因此,在對多表查詢中,必定要把小表寫在最右邊,

     --No.1  tableA:100w條記錄  tableB:1w條記錄 執行速度十秒
     select count(*) from tableA, tableB;
     --No.2  執行速度百秒甚至更高
     select count(*) from tableB, tableA;

   ②還有一種是三張表的查詢,例如
     select count(1) from tableA a,tableB b ,tableC c where a.id=b.id and a.id=c.id;
     上面中tableA 爲交叉表,根據oracle對From子句從右向左的掃描方式,應該把交叉表放在最末尾,而後纔是最小表,因此上面的應該這樣寫
     select count(1) from tableB b ,tableC c ,tableA a where a.id=b.id and a.id=c.id;

三、Where子句後面的條件過濾有講究,ORACLE對where子句後面的條件過濾是自下向上,從右向左掃描的,因此和From子句同樣同樣的,
   把過濾條件排個序,按過濾數據的大小,天然就是最少數據的那個條件寫在最下面,最右邊,依次類推,例如
   --No.1 不可取 性能低下
     select * from tableA a where
     a.id>500
     and a.lx = '2b'
     and a.id < (select count(1) from tableA  where id=a.id)

   --No.2 性能高
     select * from tableA a where
     a.id < (select count(1) from tableA  where id=a.id)
     and a.id>500
     and a.lx = '2b'

四、使用select的時候少用*,多敲敲鍵盤,寫上字段名吧,由於ORACLE的查詢器會把*轉換爲表的所有列名,這個會浪費時間的,因此在大表中少用
五、充分利用rowid ,能夠用rowid來分頁,刪除查詢重複記錄,很強大的,給兩個例子:
   --oracle查找重複記錄
   select * from  tableA  a where a.rowid>=(select min(rowid) from tableB b where a.column=b.column)
   --oracle刪除重複記錄
   delete from  tableA  a where a.rowid>=(select min(rowid) from tableB b where a.column=b.column)
   --分頁 start=10 limit=10
   --end 爲 start + limit
   --1.查詢要排列的表A
   --2.查詢A表的Rownum找出小於end的數據組成表B
   --3.查詢B表經過rownum找出大於start的數據完成
   --簡單的說先根據end值過濾數據,而後在根據start過濾數據
   SELECT * FROM
   (SELECT a.*, ROWNUM rn FROM (SELECT * FROM uim_serv_file_data ORDER BY OUID) a where ROWNUM<=20) b
   where rn>10 order by ouid desc
六、存儲過程當中須要注意的,多用commit了,既能夠釋放資源,可是要謹慎。
七、減小對數據庫表的查詢,這個很重要,能減小就減小,由於在執行語句的時候oracle會作不少初始工做。
八、少用in,多用exists來代替
   --NO.1  IN的寫法  
   SELECT * FROM TABLEA A WHERE
   A.ID IN (SELECT ID FORM TABLEB B WHERE B.ID>1)

   --NO.2 exists 寫法
   SELECT * FROM TABLEA A WHERE
   EXISTS (SELECT 1 FROM TABLEB B WHERE A.ID=B.ID AND B.ID>1)

sql

相關文章
相關標籤/搜索