Oracle 19C性能優化(huà)新特性Memoptimize Rowstore 之Fast Lookup
發布時(shí)間:2019-3-29 浏覽次數:2174
Oracle 12C 中引入了(le)In Memory Column Store的(de)新特性,該功能将熱(rè)表以列的(de)形式存放在獨立内存中,以提升聚合類查詢的(de)性能。在18C版本中,Oracle推出了(le)Memoptimize Rowstore新功能,該功能極大(dà)提升基于主鍵值表查詢的(de)性能,SQL查詢可(kě)以直接通(tōng)過主鍵鍵值訪問到Memoptimize Pool内存中的(de)數據塊,減少了(le)buffer cache訪問、磁盤IO及相關CPU的(de)消耗,從而提升查詢的(de)性能。19C中,Oracle增強了(le)Memoptimize Rowstore的(de)功能,加入Fast Ingest,通(tōng)過内存來(lái)提升主鍵表的(de)記錄插入速度。我們從字面上可(kě)以理(lǐ)解,Rowstore指在内存中存放的(de)數據是以行式存儲的(de)。與In Memory Column Store記錄以列式存儲的(de)性能區(qū)别在于,行式存儲方式更利于對(duì)表内整行數據進行的(de)檢索。與In Memory類似,Memoptimize Rowstore 配置步驟非常簡單,同樣無需對(duì)應用(yòng)SQL進行修改。我們隻需分(fēn)配Memoptimize Pool内存空間并指定需要存放在Rowstore内的(de)表就可(kě)使用(yòng)該功能了(le)。
在介紹該功能的(de)使用(yòng)前,我們先了(le)解一下(xià)Memoptimize Rowstore的(de)内部機制。Memoptimize Rowstore使用(yòng)SGA(圖一)中的(de)一塊獨立内存區(qū)域(Memoptimize Pool)來(lái)存放相關表的(de)哈希索引(Hash Index)和(hé)表的(de)數據塊(圖二)。Memoptimize Pool中75%的(de)空間分(fēn)配給Buffer,25%空間分(fēn)配給哈希索引。Oracle自動爲Memoptimize Pool中的(de)表對(duì)象創建哈希索引并進行維護,無需人(rén)工幹預。對(duì)于需要進行快(kuài)速查詢的(de)表對(duì)象,我們隻需要通(tōng)過CREATE TABLE 或ALTER TABLE語句來(lái)指定表的(de)MEMOPTIMIZE FOR READ屬性,就能控制表是否通(tōng)過Memoptimize Rowstore進行優化(huà)。需要注意的(de)是,需要存放在Memoptimize Pool内的(de)表隻能是heap-organized表,表必須有主鍵且不能是壓縮表。
下(xià)面我們簡要介紹一下(xià)Memoptimize Rowstore快(kuài)速查詢的(de)使用(yòng)步驟。 1. 啓用(yòng)Memoptimize Rowstore。 數據庫版本必須18C或以上。指定實例啓動參數MEMOPTIMIZE_POOL_SIZE的(de)大(dà)小,該參數不能動态調整,需要重啓實例。需要注意Memoptimize Pool是個(gè)固定的(de)内存空間,意味著(zhe)其不受自動内存管理(lǐ)功能(Automatic Memory Management)控制。數據庫SGA_TARGET自動管理(lǐ)不會根據數據庫壓力自動調整Memoptimize Pool的(de)大(dà)小。 2. 重啓實例,檢查Memoptimize Pool是否生效 SQL> SHOW PARAMETER MEMOPTIMIZE_POOL_SIZE 3. 使用(yòng)CREATE TABLE 或ALTER TABLE語句來(lái)指定表的(de)MEMOPTIMIZE FOR READ屬性 CREATE TABLE flookup ( id NUMBER(5) PRIMARY KEY, --表必須有PK test_col VARCHAR2(15)) MEMOPTIMIZE FOR READ; ALTER TABLE sh.sales MEMOPTIMIZE FOR READ; 4. 使用(yòng)DBMS_MEMOPTIMIZE.POPULATE将表數據加載至Memoptimize Pool内,數據加載完成後,基于Memoptimize Rowstore的(de)快(kuài)速查詢功能立即生效。 execute DBMS_MEMOPTIMIZE.POPULATE('SH','SALES'); 5. 關閉表的(de)快(kuài)速查詢功能。使用(yòng)ALTER TABLE 指定表NO MEMOPTIMIZE FOR READ 屬性。 6. 查詢表記錄。基于Memoptimize Rowstore 的(de)快(kuài)速查詢适用(yòng)于帶主鍵值的(de)查詢語句。 如以下(xià)查詢: SELECT * FROM customer WHERE cust_id = 10; 新特性Memoptimize Rowstore快(kuài)速查詢是針對(duì)有主鍵表的(de)行式數據查詢的(de)一個(gè)優化(huà)功能,其配置簡單且無需修改應用(yòng)。該功能特别适用(yòng)于IoT等有大(dà)量數據且頻(pín)繁基于主鍵查詢的(de)表對(duì)象性能優化(huà)。
NAME TYPE VALUE
--------------------- ----------- -----
memoptimize_pool_size big integer 10G