oracle 12c 內存列式存儲選項(基礎知識)


 

內存列式存儲(IM column store)(此特性在12cr1(12.1.0.2)版本后開始可用)是系統全局區中一個可選的部分,表中的數據是以列的形式而不是行的形式存儲在內存里面的,如下圖所示.在針對某列作查詢的應用場景中,列式存儲能極大地提升語句的執行速度.

IM的列存儲在SGA中一個新的靜態池。傳統的表數據是以行為單位存儲,列作為行的一個個片斷,列式存儲是以一種新的列格式。每個列被存儲為一個單獨的結構。列存儲區不取代緩沖區緩存,但作為一個補充,使數據可以存儲在內存中的行和列格式。要使用列存儲,初始化參數(inmemory_size)必須設置為非零值。

您可以在以下任何級別啟用列式存儲:

Column(列)

Table(表)

Materialized view(物化視圖)

Tablespace(表空間)

Partition(分區)

如果是在表空間級啟用列存儲,所有在此表空間里的表和物化視圖默認情況下啟用會啟用列式存儲。可以在列存儲的所有數據庫對象的列或數據庫對象的列的子集上啟用。類似地,對於一個分區表或物化視圖,列存儲都可以在某些列或列的子集上啟用。

使用列存儲,可以顯著提高對數據庫對象上執行的以下類型操作的性能:
1.掃描大量行的查詢,並將使用諸如下列運算符的篩選器:=,< >
2.從表或物化視圖中選擇一個小的列的查詢,有大量的列,如從表中選擇五列的查詢,100列
3.將小的表連接到大表的查詢
4.聚合類的查詢

通常情況下,創建多列索引以提高分析和報表查詢的性能。但這些索引可以降低數據操作語言(DML)語句的性能。當一個數據庫對象啟用列存儲中時,用於分析或報表查詢的索引可以被減少或刪除,而不會影響查詢性能。刪除這些索引可以提高交易和數據加載操作的性能。
列式存儲可以在以下ddl語句中使用INMEMORY 子句啟用.

  • CREATE TABLE

  • ALTER TABLE

  • CREATE TABLESPACE

  • ALTER TABLESPACE

  • CREATE MATERIALIZED VIEW

  • ALTER MATERIALIZED VIEW

 通常情況下,通過 v$im_segments視圖查詢那些已經啟用了列存儲的數據庫對象:

SELECT OWNER, SEGMENT_NAME, INMEMORY_PRIORITY, INMEMORY_COMPRESSION 
   FROM V$IM_SEGMENTS;
在列存儲中,數據可以被壓縮,和SQL查詢執行直接對壓縮的數據。
 IM Column Store壓縮方法
CREATE/ALTER Syntax                                             描述
NO MEMCOMPRESS 不壓縮
MEMCOMPRESS FOR DML 這種方法優化DML操作和壓縮列存儲數據以最小比率(包括 no memCompress)。
MEMCOMPRESS FOR QUERY LOW

使用此選項的結果會獲得最佳的查詢性能。
該方法將存儲數據大於memCompress for DML的壓縮比但小於memCompress for query high 選項。
,此選項是默認的選項當INMEMORY子句沒有指定壓縮方法時。

MEMCOMPRESS FOR QUERY HIGH

此選項將為查詢提供較好的查詢性能。
此方法的壓縮比率高於MEMCOMPRESS FOR QUERY LOW但小於MEMCOMPRESS FOR CAPACITY LOW選項。

MEMCOMPRESS FOR CAPACITY LOW  

使用此方法結果是良好的查詢性能。

MEMCOMPRESS FOR CAPACITY HIGH  該方法會導致查詢結果的公平性。

列存儲數據選項
當您啟用列存儲的數據庫對象時,您可以讓數據庫對象的數據填充在列存儲(默認)中,或者您可以指定一個優先級級別來確定在隊列中的數據庫對象的優先級。Oracle SQL包括內存優先級小節提供人口隊列的更多控制。例如,它可能是更重要的或不填充數據庫對象的數據填充數據的其他數據庫對象的重要。

 列式存儲的優先級選項

CREATE/ALTER 語法 描述
PRIORITY NONE


這是默認的級別,不必在語句中顯示寫出。

PRIORITY LOW

數據被放入列式存儲區的優先級高於優先級:PRIORITY NONE。
數據被放入列式存儲區的優先級低於優先級:MEDIUMHIGH, CRITICAL.。

PRIORITY MEDIUM 數據被放入列式存儲區的優先級高於優先級:NONE,PRIORITY LOW。
數據被放入列式存儲區的優先級低於優先級:HIGH, CRITICAL.。
PRIORITY HIGH 數據被放入列式存儲區的優先級高於優先級:NONE,LOW,MEDIUM。
數據被放入列式存儲區的優先級低於優先級:CRITICAL.。
PRIORITY CRITICAL 系最高的優先級,數據將別最優先的數據放入列式存儲區中.

 

與列式存儲相關的初始化參數

Initialization Parameter                                                                                           描述
INMEMORY_SIZE  

此初始化參數設置數據庫實例中列存儲池的大小。
默認值為0,即禁用列式存儲。此初始化參數必須設置為一個非零值,以啟用列式存儲。如果該參數被設置為非零值,那不能小於100m。
在一個多租戶環境,在根此參數的設置是針對整個多租戶數據庫(CDB)設置容器。這個參數也可以設置在每個插入的數據庫(PDB)限制每個PDB IM列存儲的最大大小。PDB的值可以小於,等於,或大於cdb的大小。除非這個參數為某個特定的pdb設置,這意味着PDB可以使用所有可用IM列存儲大小。

 


INMEMORY_FORCE   

 

此初始化參數可以啟用列式儲存對表和物化視圖,或禁用列式存儲的對所有表和物化視圖。
此參數設置為默認值,默認值,允許,或沒有,在單獨的數據庫對象的屬性確定是否將填充在我列存儲。
將此參數設置為關閉。

 INMEMORY_CLAUSE_DEFAULT

 此初始化參數使你為新表和物化視圖指定一個默認的內存列式存儲子句。

 

 INMEMORY_QUERY  這個初始化參數將定義in momory 查詢是否被允許。
 INMEMORY_MAX_POPULATE_SERVERS  此參數將定義最大的后台進程個數為列式存儲服務,此參數的設置應該根據系統的cpu core 來指定。
 INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT  
 OPTIMIZER_INMEMORY_AWARE  此參數將影響優化器在優化sql執行計划時是否考慮列式存儲。將此參數設置為false將使優化器忽略內存列式存儲。

在數據庫中啟用列存儲
在表中,表空間,或物化視圖啟用 列存儲功能之前,必須在數據庫級別啟用IM列存儲。
使數據庫啟用列存儲,完成以下步驟:
確保數據庫是在12.1.0 或兼容性較高的版本。
1.inmemory_size初始化參數設置為非零值。
2.當你設置這個參數在服務器參數文件(二進制文件)使用ALTER SYSTEM語句,需要指定scope= SPFILE。
3.最小設置為100m。
4.重新啟動數據庫。

例如

alter system set inmemory_size=100M scope=spfile;
 
System altered.
 
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
 

創建表的時候指定列式存儲

CREATE TABLE test_inmem (
     id        NUMBER(5) PRIMARY KEY,
     test_col  VARCHAR2(15))
  INMEMORY;

修改表以啟用列式存儲

ALTER TABLE oe.product_information INMEMORY;

 為表啟用列式存儲壓縮方式

ALTER TABLE oe.product_information INMEMORY MEMCOMPRESS FOR CAPACITY LOW;

為表定義列式存儲優先級

ALTER TABLE oe.product_information INMEMORY PRIORITY HIGH;

完整示例

ALTER TABLE oe.product_information  
   INMEMORY MEMCOMPRESS FOR QUERY (
      product_id, product_name, category_id, supplier_id, min_price)
   INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (
      product_description, warranty_period, product_status, list_price)
   NO INMEMORY (
      weight_class, catalog_url);

創建表空間的時候啟用列式存儲

CREATE TABLESPACE tbs1 
   DATAFILE 'tbs1.dbf' SIZE 40M 
   ONLINE
   DEFAULT INMEMORY;

修改表空間啟用列式存儲

ALTER TABLESPACE tbs1 DEFAULT INMEMORY 
   MEMCOMPRESS FOR CAPACITY HIGH 
   PRIORITY LOW;

創建物化視圖時其用列式存儲

CREATE MATERIALIZED VIEW oe.prod_info_mv INMEMORY 
  AS SELECT * FROM oe.product_information;

修改物化視圖使用一個列式存儲優先級選項

ALTER MATERIALIZED VIEW oe.prod_info_mv INMEMORY PRIORITY HIGH;

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM