近期SQL優化總結

   近期作SQL優化,發現了一些問題,感受仍是有必要拉出來講說的,不涉及多麼高深的技術問題、或者與技術沒多大關係,大多都是思想認識的問題,多想一想多看看應該都會解決的。數據庫

   固然這裏有個成本和效益的問題,某些年前我向某些人提到相似的問題,但人家以時間和成本爲由給擋了回來,這個我也能理解,畢竟作項目是要賺錢的,虧本的買賣沒人作,一個項目就那麼點錢,也是沒辦法的。框架

1. 綁定變量的問題。ide

   主要是不少語句沒有綁定變量,主要是寫在Java裏面的語句,主要是由框架引發的,不一樣框架有不一樣的寫法,說究竟是對框架的不熟悉,多瞭解下應該都能避免的。函數

2. 隱含轉換的問題。優化

   多發生於date、number、char/varchar2類型及其子類型,一是設計不合理,二是思想認識的問題了,這個是老生常談的話題了。spa

3. 減小表的訪問次數問題。設計

   主要是某些語句中重複對某些表的屢次使用,可考慮使用with語句、decode、case等來進行替換。code

4. 中間結果集大小的問題。排序

   就是,是先join鏈接,後過濾條件呢?仍是先過濾條件,後join鏈接的問題。索引

5. 列上作運算的問題。

   特別是索引列,如,非空、大小寫的處理。這塊應該在應用層處理好,而後再到數據庫進行運算,而不是讓數據庫來處理這些。

6. order by、group by 、distinct、union等關鍵字要特別關注。

   在使用前先想想,到底要不要使用,怎麼用才合理,是否有別的替代方案,不要三七二十八一上來就用。

7. 要善於使用Oracle的函數。

   如:經常使用的decode、case、分析函數等,邏輯清晰、功能強大,比本身絞盡腦汁寫一堆廢話強多了。

8. 聚合操做取了沒必要要的列,列上又作了操做(或作了排序)。

   如:select count(1) from (select t.empno,t.ename,... from scott.emp e ... 

                              where ...  order by 1 ...);

   須要這個嗎?

9. 行爭用的問題。

   頻繁地對某些表作DML操做(增刪改),會引發嚴重的行爭用。根源一是表設計不合理,二是相關的語句執行效率低下。要想下降,一是在設計上分爲中間臨時表、當前表、歷史表來分散這些DML操做,二是提升語句的質量。

10. 業務邏輯上的處理,複雜了,不講了。

   綜上所述,搞SQL優化思想意識很重要,固然錢也很重要(項目管理的四個大要素,時間、成本、質量、範圍,那個和錢沒有關係),因此在時間和成本不是問題的前提下,我以爲仍是能夠看看的,若是時間和成本是問題了,那就麻煩了。

相關文章
相關標籤/搜索