本文內容摘自《劍破冰山——Oracle開發藝術》一書。 1、避免對列運算 要善於通過等價改寫消除 SQL 中對列的運算,這樣可以避免索引無法使用。 2、消除隱式轉換 3、關註空格(避免粗心) 4、存儲過程與許可權 存儲過程有編譯和執行兩個階段,編譯階段,調用許可權和定義許可權是一樣的,而執行階段則不同。 ...
本文內容摘自《劍破冰山——Oracle開發藝術》一書。
1、避免對列運算
要善於通過等價改寫消除 SQL 中對列的運算,這樣可以避免索引無法使用。
2、消除隱式轉換
3、關註空格(避免粗心)
4、存儲過程與許可權
存儲過程有編譯和執行兩個階段,編譯階段,調用許可權和定義許可權是一樣的,而執行階段則不同。
5、提防 DDL 提交事務
DDL 語句會在當前 session 完成 commit 動作,即便這個 DDL 操作失敗了也依然如此。事實上,DDL 語句執行的第一步就是 commit,然後才是執行 DDL 本身,無論命令本身是否執行成功,只要 DDL 關鍵字出現,系統就會提交。在存儲過程中要避免因 DDL 出現而破壞了事務的原子性。
6、INSERT INTO 應列出全部欄位
7、OR 條件(註意加括弧)
8、SEQUENCE 中的 CACHE
剛創建的序列必須用 nextval 來獲取初始值,否則會提示 ORA-08002。如果設置了序列的 cache 後執行"alter system flush shared_pool"清空記憶體,會導致被緩存的序列號丟失。重啟資料庫也會導致 cache 中的連續號被清空。實際應用中一般不會要求序列連續,可以通過 cache 提高插入速度,且 cache 不應太小,一般也不要超過 300 個,再多性能提升也不明顯了。其實即便設置了 nocache,只要執行了 nextval(如插入失敗)就會導致斷號,所以 nocache 選項沒什麼用!
9、樹形查詢易錯處
過濾條件最好在 start with 後面和 connect by 後面都寫上,這樣才能有效的避免重覆展現記錄(where 後面可以省略),熟練且正確的使用樹形查詢是非常有用的,將會給工作帶來很大的方便。
10、小心保留字(V$RESERVED_WORDS,該視圖出現的 keyword 都是關鍵字)
其中 reserved 為 'Y' 那些關鍵字(也就是 plsqldev 中預設會變粗那些關鍵字)是不能直接作為標識符使用的,除非用雙引號包裹,但這會給查詢帶來不便。比較坑的關鍵字有 size、current_date 等。
11、函數索引陷阱
自定義函數使用函數索引,如果改變了函數代碼則必須重建函數索引,否則 Oracle 將使用這個函數索引查詢出錯誤的結果且不提示任何錯誤,這應該是 Oracle 的 BUG。
12、標量子查詢
標量子查詢只和外關聯語句寫法等價,與內關聯語句可能不等價。
標量子查詢要避免單行子查詢返回多個行,可以返回 0 或 1 行,否則就會包 ORA-01427 錯誤。因此使用標量子查詢的場合大多選擇在兩表關聯皆為主鍵的場合,在特定場合,業務允許一對多關聯並隨機取一條時,我們需用 rownum=1 來限制返回行數。
本文鏈接:http://www.cnblogs.com/hanzongze/p/oracle-sql-mistakes.html
版權聲明:本文為博客園博主 韓宗澤 原創,作者保留署名權!歡迎通過轉載、演繹或其它傳播方式來使用本文,但必須在明顯位置給出作者署名和本文鏈接!個人博客,能力有限,若有不當之處,敬請批評指正,謝謝!