【最佳化】ALL_ROWS模式和FIRST_ROWS模式的適用場景
ALL_ROWS模式適用場景:希望最佳化程式給出一種儘快得到全部記錄的執行計劃,目標是增加系統的吞吐量。
FIRST_ROWS模式使用場景:希望最佳化程式給出一種可以迅速的得到第一行的執行計劃,目標是減少系統的響應時間。
兩種模式需要具體場景具體分析,比如常見的Web應用,很少有一次性得到全部記錄的情況,都是分多頁互動的響應操作者,因此預設的ALL_ROWS模式就不太適合了,應該考慮使用FIRST_ROWS模式進行最佳化。
又如,我們想要生成全部資料的報表,那麼預設的ALL_ROWS模式就比較的適合。
透過一個實驗看一下兩種最佳化模式下的執行計劃的不同之處。
1.預設情況下,資料庫採用ALL_ROWS模式。
sec@ora10g> show parameter optimizer_mode
NAME TYPE VALUE
------------------- -------------------- -----------------
optimizer_mode string ALL_ROWS
2.建立千萬級別的測試表t,開啟autotrace,檢視一下預設ALL_ROWS模式下的執行計劃。
sec@ora10g> set autot trace explain
sec@ora10g> select t1.x, t2.x from t t1, t t2 where t1.x = t2.x and t1.owner='SEC';
Execution Plan
----------------------------------------------------------
Plan hash value: 2371815244
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99695 | 2823K| | 43627 (1)| 00:08:44 |
|* 1 | HASH JOIN | | 99695 | 2823K| 3408K| 43627 (1)| 00:08:44 |
|* 2 | TABLE ACCESS FULL | T | 99695 | 2239K| | 29985 (1)| 00:06:00 |
| 3 | INDEX FAST FULL SCAN| PK_T | 9969K| 57M| | 4871 (2)| 00:00:59 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."X"="T2"."X")
2 - filter("T1"."OWNER"='SEC')
最佳化程式給出了一個快速獲得t表全部記錄的執行計劃,使用到了索引快速全掃描的方式執行,總的執行時間較快。
3.修改最佳化模式為FIRST_ROWS模式後,再次查詢其執行計劃。
sec@ora10g> alter session set optimizer_mode =first_rows;
Session altered.
sec@ora10g> select t1.x, t2.x from t t1, t t2 where t1.x = t2.x and t1.owner='SEC';
Execution Plan
----------------------------------------------------------
Plan hash value: 217223811
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99695 | 2823K| 129K (1)| 00:25:57 |
| 1 | NESTED LOOPS | | 99695 | 2823K| 129K (1)| 00:25:57 |
|* 2 | TABLE ACCESS FULL| T | 99695 | 2239K| 29985 (1)| 00:06:00 |
|* 3 | INDEX UNIQUE SCAN| PK_T | 1 | 6 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("T1"."OWNER"='SEC')
3 - access("T1"."X"="T2"."X")
最佳化程式給出了一種快速獲得t表第一條記錄的執行計劃,使用到了索引唯一性掃描的方式執行,總的執行時間相對ALL_ROWS模式就長了許多。
4.參考一下Oracle 10g官方文件關於optimizer_mode引數的描述
OPTIMIZER_MODE
Property | Description |
---|---|
Parameter type | String |
Syntax | OPTIMIZER_MODE =
{ first_rows_[1 | 10 | 100 | 1000] | first_rows | all_rows } |
Default value | all_rows |
Modifiable | ALTER SESSION, ALTER SYSTEM |
OPTIMIZER_MODE establishes the default behavior. for choosing an optimization approach for the instance.
Values:
-
first_rows_n
The optimizer uses a cost-based approach and optimizes with a goal of best response time to return the first n rows (where n = 1, 10, 100, 1000).
-
first_rows
The optimizer uses a mix of costs and heuristics to find a best plan for fast delivery of the first few rows.
-
all_rows
The optimizer uses a cost-based approach for all SQL statements in the session and optimizes with a goal of best throughput (minimum resource use to complete the entire statement).
5.小結
這種最佳化手段給我們的啟示是什麼?Oracle預設的最佳化模式並不一定是我們想要的,必須根據自己的系統特點細心的定製。
Oracle的自動化程式越來越快,這就給一些DBA一種普遍的誤解,認為在資料庫層面上基本上不用做過多的最佳化調整,只要按照Oracle的自動化策略走就可以了。這種想法是不正確的。越是自動化,其最佳化細節就隱藏的越深,越是要靜下心來深入的探索和調整。
Good luck.
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-619516/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【優化】ALL_ROWS模式和FIRST_ROWS模式的適用場景優化模式
- 設計模式適用場景整理設計模式
- js代理模式理解和應用場景JS模式
- SPM適用的場景和示例
- 單例模式應用場景:單例模式
- MongoDB的優勢和適用場景MongoDB
- React 設計模式和場景分析React設計模式
- Streaming特性和適用場景
- 單例模式的常見應用場景單例模式
- Spark適用於哪些場景?不適用於哪些場景?Spark
- 觀察者模式應用場景例項模式
- android 啟動模式應用場景Android模式
- 本地索引和全域性索引的適用場景索引
- SQL 查詢 exist join in 的用法和相應的適用場景 (最佳化查詢)SQL
- CDN適用哪些場景?
- 教學直播系統的應用場景和變現模式詳解模式
- TokuDB的優缺點和適用場景介紹
- js裝飾者模式有哪些應用場景JS模式
- 設計模式學習筆記(十七)中介者模式及其應用場景設計模式筆記
- 設計模式學習筆記(十九)觀察者模式及應用場景設計模式筆記
- 圖解設計模式:身份認證場景的應用圖解設計模式
- 使用策略模式重構電商折扣和支付場景模式
- 單例模式常見場景單例模式
- INDEX SKIP SCAN適用場景Index
- Android中Activity的啟動模式(LaunchMode)和使用場景Android模式
- 閉鎖和柵欄的區分以及適用場景
- 設計模式應用場景之Model設計中可以用到的設計模式設計模式
- 設計模式學習筆記(四)單例模式的實現方式和使用場景設計模式筆記單例
- PHP 觀察者模式應用場景例項詳解PHP模式
- RabbitMQ 使用場景、安裝、工作模式MQ模式
- 區塊鏈不適用的若干場景區塊鏈
- innobackupex中--slave-info引數的含義和適用場景
- Android設計模式——策略模式之原始碼使用場景(三)Android設計模式原始碼
- 全息投影技術所適用的場景分析
- 談談 Redux 與 Mobx 思想的適用場景Redux
- Oracle的優化器:RBO/CBO,RULE/CHOOSE/FIRST_ROWS/ALL_ROWS 名詞解釋Oracle優化
- 企業雲盤適用哪些應用場景
- Cloudflare宣佈適用於 Linux 的 WARP 和代理模式CloudLinux模式