這篇「Oracle 19c和20c新特性」最全解密,真香!
- 2019 年 12 月 12 日
- 筆記
雲和恩墨大咖系列報道
2019數據技術嘉年華於11月16日在京落下了帷幕。大會歷時兩天,來自全國各地上千名學術精英、資料庫領袖人物、資料庫專家、技術愛好者在這裡匯聚一堂,圍繞「開源 • 智慧 • 雲數據 - 自主驅動發展 創新引領未來」的大會主題,共享"開源自研,雲和數據,智慧運維,智慧業務,數據前沿,用戶實踐"六大主題盛宴。
近期,小編為大家精心準備了「2019數據技術嘉年華——雲和恩墨大咖系列」分享,在此次嘉年華大會上,雲和恩墨專家聚焦行業熱點,分析典型案例,探索數據價值,共論智慧未來。
下面,讓我們跟隨雲和恩墨專家團來一同回顧嘉年華的精彩瞬間,領略他們眼中的數據之美吧~

本期為我們帶來分享的嘉賓是 ACOUG 核心專家,Oracle ACE 總監 楊廷琨先生,本次嘉年華上,楊老師為我們帶來題為:Oracle 19c 和 20c 的新特性解密 主題分享。下面,讓我們跟隨楊老師,一同來學習關於Oracle 19c和20c新特性吧~
在這次數據技術嘉年華大會上,我和大家分享的是Oracle最新版本的一些重要的新特性。
根據我們白求恩自動巡檢平台的數據分析結果,雖然Oracle對於11g的支援已經進入擴展維護期,但是目前業內使用最多的版本仍然是11.2,大概佔到了6成左右。而12c的版本的使用超過10g版本,總體接近3成。這說明對於很多客戶,已經逐漸把資料庫升級到了12.2及以後的版本上。12c正在逐漸變為主流的版本,因此希望把新版本中一些重要的新特性分享給大家,以便於後續在資料庫版本選擇的時候可以對新的功能做到心中有數。

12.2推出了很長時間了,大部分DBA對於12.2的特性並不陌生,因此這次主要分享18c、19c和20c的新特性。

在Oracle中,一個頻繁插入的系統在正常時刻的運行會非常穩定和高效,但是很可能突然會出現大量的競爭和等待,一般來說產生這個性能問題原因是單調遞增索引在索引分裂的時候引發的競爭和等待。絕大部分主鍵依賴於SEQUENCE產生的NEXT_VALUE,而SEQUENCE產生的值一般都是單調遞增的,因此序列產生的新值總是最大的,而索引本身又是一個排序的結構,當多個會話同時進行插入時,這些會話就會爭搶索引葉子塊的最右端,也就是最大值存放的地方。當索引需要進行分裂來擴展空間時,就會導致所有試圖插入的會話被鎖定,從而引發一系列並發等待,造成嚴重的性能問題。
在18c中,一個重要的特性就是引入了Scalable Sequence。Oracle改造了序列的構成,其後半部分就是一個標準的序列,而前半部分分別把資料庫的實例ID和當前會話的SESSION ID加到了序列中,因此在獲取序列的NEXT_VALUE時,得到的不再是遞增的數值,而且變化差異非常大的不連續的數值,從根本上改變了獲取序列的數據連續性問題,解決了由此引發的索引熱點塊爭搶的問題。

18c中使用外部表不再需要通過DDL先創建後使用的方式,可以將外部表的描述性部分直接加入到訪問的SQL語句中,從而簡化了外部表的使用和維護。尤其是針對一次性載入的外部表,INLINE外部表功能是非常方便的。

除了增加了外部表使用的便利性,在性能方面,18c也對外部表進行了優化。可以在資料庫中為外部表創建IN MEMORY快取,從而極大的加快外部表數據的運算和分析過程,對於多次訪問或進行複雜分析運算的外部表,啟用IN MEMORY外部表功能,可能會得到成百倍的性能提升。

Oracle對於PDB的複製同步功能得到進一步提升,從12.2引入了PDB的熱克隆,同時支援了克隆庫可以階段性的從源庫進行增量的數據同步,而在18c中,可以對源庫和克隆庫之間進行SWITCHOVER切換,轉換二者的身份,使得源庫變成可同步刷新的只讀克隆環境,而原本的只讀克隆庫變為可讀寫的主庫。這種PDB級別的SWITCHOVER對於計劃停機場景和非計劃故障停機場景都是有價值的。

18c中另外一個很重要的特性就是Oracle提供了對於用戶使用許可權的捕獲,可以通過開啟一個業務周期的許可權捕獲,然後獲取到這個用戶在這個業務周期內,使用了哪些許可權,訪問了哪些對象,對於分析當前用戶是否許可權過大,非常有幫助。而在之前的版本中,這個任務非常難以實現。
上面是18c中帶來的一些重要的特性,下面看看19c中Oracle又引入了哪些重大的功能和特性:

Oracle第一次提出了自製資料庫的概念,而要解決資料庫自治,自動優化是不可缺少的,而19c引入的一個重要的特性就是索引自動創建功能。當設置了自動索引創建功能後,Oracle後台會不斷的評估資料庫中運行的SQL語句,分析這個語句是否可以通過創建索引來提升性能,並嘗試創建不可見索引,如果優化器評估確認新創建的索引確實可以提高查詢性能,會將這個索引設置為可見,使得前台業務SQL語句可以使用這個索引。

針對物聯網應用場景,面臨海量數據的頻繁插入,Oracle提供了專門的優化手段:MEMOPTIMIZE FOR WRITE。開啟表的這個功能後,前台業務插入直接寫入LARGE POOL中的記憶體空間,後台進程非同步的將記憶體中的數據寫入到資料庫文件中,其本質是以犧牲事務性為代價來換取極速的插入性能,在2 Socket伺服器上可以實現每秒插入2500萬條記錄。

在19c中Oracle對於在線維護操作進一步增加,進一步降低了DDL對於正在運行系統的影響。在進行游標過期時,將會採用更加智慧的策略,將DML和SELECT按照不同的策略進行處理,採用滾動游標過期方式,避免DDL使得所有相關游標同時過期,從而導致解析風暴引發的並發鎖定問題。

在資料庫中有一類SQL比較難以處理,被稱為RUNAWAY語句,這類語句有一個特點,執行次數並不頻繁,但是會消耗大量的資源,一旦被執行就可能造成系統的性能問題。而且下次再運行的時候,可能在SQL文本上有少量的變化,導致難以通過SQL_ID的方式進行定位和處理。
Oracle針對這種SQL提供了執行計劃隔離的能力,評估一個SQL是否會被隔離不是根據SQL文本,而是根據SQL的執行計劃,一旦SQL的消耗超過了資源管理器中的閾值設置,該SQL語句對應的執行計劃就被隔離起來,後續所有採用同樣執行計劃的SQL都不會再被執行。從而有效地避免了RUNAWAY語句對於性能的影響。

19c的ADG對DML的自動重定向功能也是比較引人關注的,在配置了該功能後,在備庫上運行的DML會被Oracle通過內部DBLINK傳輸到主庫中運行,運行成功後產生的日誌發送到備庫並成功應用後,備庫上的DML才會成功返回,並可以查看到DML執行後的結果。
Oracle實現這個功能的同時並沒有犧牲資料庫的事務性,也就是說在備庫的DML未提交之前,備庫上的修改只有當前會話可見,其他會話看不到修改後的結果,當備庫的DML修改提交之後,其他會話才可以看到修改後的結果。這個功能適用於讀寫分離應用中存在很少量修改的情況,這時備庫不會報錯,而是透明的將修改應用到主庫中。

在19c中,對於Sharding的功能有了進一步的增強,其中比較重要的一點改進是目前Sharding支援多個表家族,也就是說一個Shard中可以存儲超過一套的主子表,而在以前的版本中,Oracle只允許存儲一套主子表。另外一個改進是在Sharding的目錄庫中,可以通過運行ALTER SYSTEM語句將參數設置發送到所有的Shard庫中。

Oracle在19c中對於外部數據的混合存儲功能進一步加強,允許分區表中部分分區為資料庫內的在線數據,部分分區由存儲在外部文件系統的外部數據構成。這使得資料庫中全生命周期管理功能得到進一步完善。對於很少訪問的歷史數據,不需要通過額外的歷史庫或歷史表去訪問,而是通過原表不需要修改程式就可以直接訪問到離線的只讀數據。Oracle會對不同類型的分區進行分別處理,當一個SQL同時訪問內部分區和外部分區時,Oracle將執行計劃拆分為兩個UNION ALL分支,採用不同的執行計划去獲取數據。

很多時候一些SQL的執行計劃性能低下,實際上是統計資訊不準確導致的,Oracle的19c開始將部分關鍵統計資訊實時化,從根本上避免了由於統計資訊不準確導致執行計劃低效的問題。由於統計的實時化不能以犧牲DML操作的性能為代價,因此目前實時計算的統計資訊僅包括最小值,最大值和行數。因此實時統計資訊並不能完全代替統計資訊收集,後台的自動統計資訊收集仍然需要執行。

19c在SQL方面有三方面的增強,首先增加了一個ANY_VALUE()函數,這使得在聚集操作時,可以對非關鍵列採用隨機值而不是必須使用MIN/MAX來進行處理,從而降低了處理的資源消耗;第二方面是字元串匯總功能LISTAGG增加了DISTINCT關鍵字,可以在匯總字元串之前去掉重複數據,從而降低了SQL語句的複雜度;第三方面可以在計算DISTINCT的使用採用BITMAP的方式,從而獲取更好的性能。
上面介紹了18c和19c中,Oracle最新的一些功能和特性,下面我們看一下在20c中,Oracle會帶來哪些新的功能:

在20c中,Oracle支援原生的區塊鏈表,這種表具備了區塊鏈的特性,包括不可篡改,加密和可驗證等,而且與分散式區塊鏈相比更容易使用。

在20c的一體機中,Oracle開始支援持久化記憶體。持久化記憶體的處理速度要比FLASH和SSD硬碟快不止一個數量級,加入了持久化記憶體後,在存儲節點上,數據會分為冷、溫和熱三個區域,冷數據存儲在硬碟中,溫數據存儲在FLASH CACHE中,而最熱的數據放在持久化記憶體中。配合最新的100G乙太網以及RoCE協議,使得IO響應延遲可以達到微秒級。

在20c中允許把SQL函數定義為類似C或JAVA語句用的宏定義的方式,該函數可以在編譯的時候進行宏展開,目前Oracle支援標量表達式和FROM語句中的TABLE表達式兩種類型的宏。

在20c中Oracle增加了兩個新的聚集函數:偏度和坡度,用來描述數據分布的情況;支援了運算聚集操作;通過GROUPS語句來擴展窗口邊界,使得分析函數的窗口功能進一步增強。

20c中Oracle內置了機器學習演算法,比如極限梯度提升樹,MSET-SPRT等。此外,這些機器學習的演算法支援多種語言的支援,比如SQL、Python和R語言。

在之前的版本中,當多租戶資料庫所在實例出現故障後,這個多租戶會在哪個倖存實例上啟動,取決於服務漂移到哪個實例上,PDB的啟動由服務來驅動。在20c中,面臨同樣的問題時,有了更多的選擇,可以定義PDB的選擇性和等級,事先定義好問題發生後,PDB會在哪個節點上啟動,此外還可以根據各個節點的運行負載以及性能差異來動態評估。

對於RAC而言,一旦發生節點關閉,資料庫會進行資源的重組,這個過程會鎖定全局資源目錄,從而導致在線的操作受到短暫的影響。在20c中,對於計劃內的停機,在關閉資料庫之前,Oracle自動完成資源的分配,避免了其他實例的恢復操作,有效的降低了對整個系統的影響。

Oracle的In-Memory功能僅需一個參數就可以實現全自動化的管理,不在需要管理員手工指定表的方式。內置的自動演算法會根據表的訪問頻繁情況,自動決定載入表或從IN-Memory記憶體中驅除表,還會自動對較少訪問的數據進行壓縮。

Oracle的In-Memory功能不僅僅針對結構化數據,對於空間資料庫和全文資料庫,同樣可以採用In-Memory來進行加速,從而獲得幾倍或更高的性能提升。

在12.2和18c中,Oracle實現了ADG切換之後的連接會話保持和Buffer Cache的保持功能,在20c中,Oracle可以實現ADG中Result Cache快取的保持功能,普通用戶將很難察覺到Data Guard主備切換帶來的影響。