內存列式存儲(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 QUERY HIGH | 此選項將為查詢提供較好的查詢性能。 |
MEMCOMPRESS FOR CAPACITY LOW | 使用此方法結果是良好的查詢性能。 |
MEMCOMPRESS FOR CAPACITY HIGH | 該方法會導致查詢結果的公平性。 |
列存儲數據選項
當您啟用列存儲的數據庫對象時,您可以讓數據庫對象的數據填充在列存儲(默認)中,或者您可以指定一個優先級級別來確定在隊列中的數據庫對象的優先級。Oracle SQL包括內存優先級小節提供人口隊列的更多控制。例如,它可能是更重要的或不填充數據庫對象的數據填充數據的其他數據庫對象的重要。
列式存儲的優先級選項
CREATE/ALTER 語法 | 描述 |
PRIORITY NONE |
|
PRIORITY LOW | 數據被放入列式存儲區的優先級高於優先級:PRIORITY NONE。 |
PRIORITY MEDIUM | 數據被放入列式存儲區的優先級高於優先級:NONE,PRIORITY LOW。 數據被放入列式存儲區的優先級低於優先級:
HIGH , CRITICAL .。 |
PRIORITY HIGH | 數據被放入列式存儲區的優先級高於優先級:NONE,LOW,MEDIUM。 數據被放入列式存儲區的優先級低於優先級:
CRITICAL .。 |
PRIORITY CRITICAL | 系最高的優先級,數據將別最優先的數據放入列式存儲區中. |
與列式存儲相關的初始化參數
Initialization Parameter | 描述 |
INMEMORY_SIZE | 此初始化參數設置數據庫實例中列存儲池的大小。 |
|
此初始化參數可以啟用列式儲存對表和物化視圖,或禁用列式存儲的對所有表和物化視圖。 |
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;