Oracle 19c和20c新特性最全解密

資料和雲發表於2019-12-10

本期為我們帶來分享的嘉賓是 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主備切換帶來的影響。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556440/viewspace-2667663/,如需轉載,請註明出處,否則將追究法律責任。

相關文章