總結面試中關於優化話題

應用程序這邊,可以優化的方面包含service層和persistence層。

Service層,對於一些需要長時間執行的代碼,分離他們可變與不可變的部分,不可變的部分做成單例或者將結果緩存起來,緩存策略可以採用EHCash等開源工具,它支持方法級別的緩存,同時支持當別的方法調用時刷新緩存方法結果。特別注意是For循環中對象的實例化。

Persistence層,網上方法比較多,大致有以下一些:

1根據業務邏輯的需求,SQL&HQL查詢條件儘量精確, 同時平衡好數據內存空間與查詢次數的關係

2:緩存不常修改的VO

3:對於大批量的select, update和insert操作,我可以採用批處理fetch_size和batch_size

4:設置合適的抓取策略,避免出現N+1,通過setFetechModel和fetch=”select/join”

5:合理使用緩存,get() & load()以及 list() & integrator()

6:設置延遲加載等

數據庫這邊,本人對數據的理解也不是特別深,知識範圍內能想到的有以下(Oracle):

1:根據表數據量的大小,決定是否使用索引。

對於數據量不是特變大的表,我們一般不使用索引,而使用全表掃描,因爲全表掃描的一次IO會去抓取多個數據塊內容;

而如果使用索引的話,索引會首先根據ROWID去抓取數據,每一次的IO都是發送一個ROWID去抓取,如果數據量超過5%- 10%的話,Oracle要花費大量的時間在IO上,查詢效率的影響比較大。(估計Oracle這時會自動採用全表掃描吧)

2:索引創建過程中考慮的問題

索引應該創建在常用的where條件上,對於多個查詢條件的SQL,可以創建組合索引,但是組合索引的引導列必須出現被包含在where條件中

3:檢查優化SQL,儘量發揮現有索引的效能,比如(>, in,%)將阻止索引效能的發揮

4:利用SGA

         不同區域出現的相同的SQL要保證查詢字符完全相同,建議採用變量代替常量,以儘量使用重複SQL,以利用SGA共享池,避開Parse階段。因此使用存儲過程,可以有效利用SGA共享池,提高執行效率。

5:From 和 Where後面的語句順序。

         對於From,表應按結果集由大到小的順序從左往右排列,因爲表間連接時,最右邊的表會被放到嵌套循環的最外層。最外層的循環次數越少,效率越高。

對於where,能使結果最少的條件放在最右邊,SQL執行是按從右到左進行結果集的篩選的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章