面试中回答关于oracle数据库优化的方法
1關于優化器的優化配置
介紹oracle數據庫優化的基本方式,基于規則的優化,基于規則包括全表掃描,掃描第一行
(需要上網查看一下)
基于成本的優化,基于選擇的優化
也就是oracle的3種優化器,關于優化器的配置可以通過oracle數據庫啟動的時候通過初始化
數據庫配置文件來配置 通過配置init.ora文件的optimizer_mode也就是優化模式的參數來
配置這個配置是一個全局的共享配置。優化模式可以根據具體的生產環境在用戶會話級別和sql
級別進行在配置 ,來覆蓋全局的優化模式配置
使用基于成本的優化器要運行一個命令 analyze(分析)讓oracle分析表 統計統計數據對象
達到更好的優化效果.(如果針對表執行了analyze 將自動使用基于成本的優化器)
2oracle訪問表的方式優化
a 全表掃描模式 全表掃面oracle采用讀取數據塊的方式對全部表進行掃面塊的大小可以在
init.ora中配置 數據塊的大小應該是系統的數據塊的整數倍。適當調節數據塊的大小可以
起到性能優化的作用
b 通過rowid訪問數據表 rowid表記錄的物理位置信息標記,oracle通過索引與rowid建立
聯系通過適當的在字段上建立索引可以高速高效的訪問數據表的記錄,從而達到數據庫優化
查詢的目的。
3 共享sql語句
為了不重復解析SQL語句oracle采用共享SQL的方式提高SQL語句執行效率。oracle把執行過的
語句放入到一個叫做SGA內存區域的share buffer pool 中 也就是系統全局區域的緩存共享池
如果客戶端執行的SQL語句完全相同oracle首先查找share buffer pool 如果存在這個語句
直接執行這個語句。不過oracel對SQL語句的匹配要求很嚴格是在字符級別進行匹配的,包括
執行語句的字符匹配。所以在實際的項目中盡量要求編碼人員統一規范編寫SQL語句盡量做到
統一以提高數據庫的性能和執行效率。還有就是oracle基于對象的共享匹配,包括用戶對象,
變量的綁定在權限對象分配中和dba溝通做好系統優化的準備。
我們可以適當的提高SGA中share buffer pool 的大小 來優化數據庫的執行效率
4 根據oracle的SQL語句解析器進行優化
首先解釋一下oracle?解釋SQL的語句的順序,oracle在解釋SQL語句的時候是按照從右到左
的順序進行解析。所有要把檢索效率最高的表,記錄最少的表寫在FROM的最右表也就是基礎
表的選擇
5 交叉表優先選擇
在多對多的表關聯中會遇到這樣的情況。在sql語句的書寫方面盡量把引用表放在FROM的
右邊
6 基于wher條件書寫順序的解釋優化
首先介紹一下oracle
以上兩個數據庫優化的基本原則就是根據oracle解析sql語句和oracle自身對在掃描表的時候
做的優化基礎上盡量優先選擇出記錄少的表放在from的最右邊
7盡量減少與數據庫的交互減少系統的IO訪問量
8 不要用*
9 使用decode函數減少處理時間
10 整合簡單的無關聯的數據庫訪問 較少數據庫服務器的IO操作
11刪除重復記錄 盡量使用RID
12 用TRUNCATE替代DELETE
13 在編寫pl/sql時候盡量多使用cimmit 以便釋放系統資源
只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:
COMMIT所釋放的資源:
a. 回滾段上用于恢復數據的信息.
b. 被程序語句獲得的鎖
c. redo log buffer 中的空間
d.?ORACLE為管理上述3種資源中的內部花費
14. 用Where子句替換HAVING子句
避免使用HAVING子句, HAVING 只會在檢索出所有記錄之后才對結果集進行過濾.
這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷.
例如:
低效:
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
高效
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
GROUP BY REGION
(譯者按: HAVING 中的條件一般用于對一些集合函數的比較,如COUNT() 等等.
除此而外,一般的條件應該寫在WHERE子句中)
15 盡量少用子查詢 合并可以合并的子查詢
例如:
低效
SELECT TAB_NAME
FROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)
高效
SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
WHERE VERSION = 604)
Update 多個Column 例子:
低效:
UPDATE EMP
SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
高效:
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
15. 使用表的別名(Alias)
當在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,
就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤.
(譯者注: Column歧義指的是由于SQL中不同的表具有相同的Column名,
當SQL語句中出現這個Column時,SQL解析器無法判斷這個Column的歸屬)
轉載于:https://www.cnblogs.com/liuzhuqing/archive/2012/08/06/7480730.html
總結
以上是生活随笔為你收集整理的面试中回答关于oracle数据库优化的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 九、XML和Json的特点
- 下一篇: Oracle常用命令大全