[20190219]那個更快(11g).txt

来源:https://www.cnblogs.com/lfree/archive/2019/02/19/10399988.html
-Advertisement-
Play Games

[20190219]那個更快(11g).txt--//前幾天測試11g Query Result Cache RC Latches時,鏈接http://blog.itpub.net/267265/viewspace-2632907/--//有網友指出測試有問題,建立索引唯一,並不會導致select ...


[20190219]那個更快(11g).txt

--//前幾天測試11g Query Result Cache RC Latches時,鏈接http://blog.itpub.net/267265/viewspace-2632907/
--//有網友指出測試有問題,建立索引唯一,並不會導致select count(*) from t,選擇索引執行.實際上執行計劃還是全表掃描.
--//也就有瞭如下測試,不過結果有點讓我吃驚,設置not null反而更慢.通過測試說明:
--//另外我也做了10g下的測試,鏈接如下:http://blog.itpub.net/267265/viewspace-2636321/ => [20190215]那個更快(10g).txt

1.環境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create table t as select rownum id from dual ;
--//分析表略.
--//另外說明一下,先建立表主要避免編譯過程時報錯.

2.建立測試環境:
create table job_times (sid number, time_ela number,method varchar2(20));

CREATE OR REPLACE PROCEDURE do_work
(
   p_iterations   IN NUMBER
  ,p_method       IN VARCHAR2
)
IS
   l_rowid   ROWID;
   v_t       NUMBER;
BEGIN
   INSERT INTO job_times VALUES ( SYS_CONTEXT ('userenv', 'sid') ,DBMS_UTILITY.get_time ,p_method) RETURNING ROWID INTO l_rowid;

   FOR i IN 1 .. p_iterations
   LOOP
      SELECT COUNT (*) INTO v_t FROM t;
   END LOOP;

   UPDATE job_times SET time_ela = DBMS_UTILITY.get_time - time_ela WHERE ROWID = l_rowid;

   COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE do_work1
(
   p_iterations   IN NUMBER
  ,p_method       IN VARCHAR2
)
IS
   l_rowid   ROWID;
   v_t       NUMBER;
BEGIN
   INSERT INTO job_times VALUES ( SYS_CONTEXT ('userenv', 'sid') ,DBMS_UTILITY.get_time ,p_method) RETURNING ROWID INTO l_rowid;

   FOR i IN 1 .. p_iterations
   LOOP
      SELECT COUNT (*) INTO v_t FROM t where id=1;
   END LOOP;

   UPDATE job_times SET time_ela = DBMS_UTILITY.get_time - time_ela WHERE ROWID = l_rowid;

   COMMIT;
END;
/

3.測試:
--//執行腳本如下:註一定要等N個會話執行完成在回車,進行下一項測試.
--//可以打開另外的會話執行select method,count(*),avg(TIME_ELA),sum(TIME_ELA) from job_times group by method order by 3 ;
--//確定測試是否完成.

$ cat bb.txt
delete from job_times;
commit ;
drop table t purge;
create table t as select rownum id from dual ;
execute sys.dbms_stats.gather_table_stats ( OwnName => user,TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false);
alter procedure do_work compile ;
alter procedure do_work1 compile ;
host sleep 5

host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,'null')\" & "  | bash > /dev/null
host read -p 'wait finish...'

create unique index pk_t on t(id);
alter table t modify (id  not null);
host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,'notnull')\" & "  | bash > /dev/null
host read -p 'wait finish...'

host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work1(&&3,'id=1_unique_index')\" & "  | bash > /dev/null
host read -p 'wait finish...'

drop index pk_t ;
create index pk_t on t(id);
host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work1(&&3,'id=1_index')\" & "  | bash > /dev/null
host read -p 'wait finish...'

alter table t result_cache (mode force);
host seq &&1| xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,'result_cache')\" & "  | bash > /dev/null
host read -p 'wait finish...'

--//簡單說明:執行需要3個參數,參數1:啟動連接數,參數2:scott口令,參數3,迴圈次數.
--//執行如下:  @ bb.txt 50 book 1e6
--//第1種方式:執行計劃是全表掃描,邏輯讀2(10g下這裡是3),看到的等待事件是cursor: pin S.很奇怪11g下看不到latch: cache buffers chains相關等待事件.
--//第2種方式:建立唯一索引,加入約束id not null,這樣執行計劃INDEX FULL SCAN,邏輯讀1.看到的等待事件是latch: cache buffers chains,偶爾能看到cursor: pin S.
--//第3種方式:執行語句加入謂詞id=1,這樣執行計劃INDEX UNIQUE SCAN,邏輯讀1.看到的等待事件是cursor: pin S,在11g下latch: cache buffers chains看不到.
              註:在這種情況cbc latch減少一半比其它方式.
--//第4種方式:索引修改非唯一,執行語句加入謂詞id=1,這樣執行計劃是INDEX RANGE SCAN,邏輯讀1.看到的等待事件是latch: cache buffers chains.偶爾能看到cursor: pin S.
--//第5種方式:設置result_cache=force;邏輯讀0,看到的等待事件是cursor: pin S.

--//測試結果如下:
SCOTT@book> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
result_cache                 50                   8611        430536
id=1_unique_index            50                   9494        474714
null                         50                  10664        533197
id=1_index                   50                  28160       1407987
notnull                      50                  29279       1463928


--//你可以發現結果按照快慢排序 result_cache => id=1_unique_index => null => id=1_index,notnull,實際上最後2個結果很接近.

--//使用result_cache 最快很好理解,為什麼設置列NULL比not null快許多呢?

--//而且設置欄位id NULL是全表掃描,至少2個邏輯讀(對於ctas建立的表),而設置欄位id NOT NULL 走的是快速全索引掃描(1個邏輯讀).
--//看測試結果 not null的情況下幾乎慢了3倍.

--//實際上欄位設置 not null更慢.因為這時出現cursor: pin S 外,還出現外還大量出現 latch: cache buffers chains,而全表掃描
--//反而不出現latch: cache buffers chains等待事件.這樣設置not null反而更慢.

--//11g在處理latch: cache buffers chains上做了一些優化,讀讀情況下有時候看不到cbc latch.
--//不過id=1_unique_index這樣的情況下反而比10g執行要慢.
--//在10g下測試如下:
SCOTT@test> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
id=1_unique_index            50                   4864        243192
notnull                      50                  34134       1706713
id=1_index                   50                  34703       1735173
null                         50                  37234       1861717

--//實際上10g,11g是硬體配置一樣,os安裝也一樣.
--//附上監測wait腳本:
 $ cat wait.sql
select p1raw,p2raw,p3raw,p1,p2,p3,sid,serial#,seq#,event,status,state,wait_time_micro,seconds_in_wait,wait_class
from v$session where ( wait_class<>'Idle' or (status='ACTIVE' and STATE='WAITED KNOWN TIME'))
and sid not in (select sid from v$mystat where rownum=1)
order by event ;




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一種 如果已經有視圖但是要加索引只需要執行 以下SQL就好(前提是此視圖必須 綁定到架構) 第二中創建索引的方式 1 2 3 4 5 6 7 8 9 視圖創建索引完畢 ...
  • PostgreSQL 的安裝及圖形化工具 pgAdmin 的安裝及中文顯示。 ...
  • 當同一個變數被連續插入兩次會出現id相同的異常,但是同樣內容的兩個變數同時插入不會有問題,可能是同一個變數同一個地址生成id相同,導致異常。 預設登陸不需要用戶名密碼認證,需要密碼認證登陸需要在admin資料庫user集合添加用戶,並且以需要認證的方式啟動,mongodb --auth,如果初始沒有 ...
  • 1.安裝 下載安裝後解壓即可執行make命令完成編譯,完整命令如下: wget http://download.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd redis-stable make 編譯完成後直接執行make in ...
  • 最初,數據在文件中存儲,稱為 文件處理系統 。 但由於數據越來越龐大,形式越來越多樣,操作存在文件中的數據變得愈加困難和繁瑣。 於是,誕生了資料庫軟體,用於專門管理數據。 + 其一,使用統一的結構進行存儲; + 其二,方便用戶存取數據; + 其三,提供所存儲信息的安全性保證。 資料庫一共有3種模型: ...
  • 在前面的分享中,有講解 “詳解MongoDB中的多表關聯查詢($lookup)” 一節,其內容涵蓋了常見的集合管理的需求。我們知道文檔的選擇都是通過$match進行匹配刷選。但這是文檔間的匹配篩選,並沒有對單個新生成的文檔進行內嵌子文檔進行篩選。 那麼什麼是$lookup後新文檔的內嵌子文檔呢? 假 ...
  • 安裝前準備 主機和系統 Host OS Memory IP bigdata001-dev Cent OS 7.4 x64 32G 192.168.1.1 bigdata002-dev Cent OS 7.4 x64 32G 192.168.1.2 bigdata003-dev Cent OS 7.4 ...
  • 實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制參數等配置,程式不直接做增刪改; 如果當前需求需要新增新的控制參數,由開發人員提供腳本,運維執行; 通常在插入數據時,主鍵的生成,通常採用的是max(t.id) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...