8 集計の最適化
Database In-Memoryは、集計と算術の時間を短縮する最適化を提供します。
この章のトピックは、次のとおりです:
8.1 インメモリー集計による結合の最適化
Oracle Database 12cリリース1 (12.1.0.2)以降、インメモリー集計(IM集計)では、問合せにおいて、スキャン処理しながら集計できます。
この項では、次の項目について説明します。
8.1.1 IM集計について
IM集計では、集計に関与する問合せブロックが最適化され、1つの大きい表から複数の小さい表に結合されます。
KEY VECTOR
およびVECTOR GROUP BY
操作では、結合および集計のために効率的な配列が使用されます。オプティマイザにより、コストに基づくGROUP BY
操作のためにVECTOR GROUP BY
が選択されます。オプティマイザでは、GROUP BY ROLLUP
、GROUPING SETS
またはCUBE
操作のためにVECTOR GROUP BY
集計が選択されることはありません。
ノート:
IM集計は、ベクター集計およびVECTOR GROUP BY
集計とも呼ばれます。
IM集計では、INMEMORY_SIZE
がゼロ以外の値に設定される必要があります。ただし、IM集計では、参照される表がIM列ストアに移入されている必要はありません。
関連項目:
-
SQL集計についてさらに学習するには、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照
8.1.2 IM集計の目的
IM集計では、大きい表で実行される、行ごとの処理を高速化するために、小さい表が前処理されます。
一般的な分析問合せでは、ファクト表から集計し、それをディメンション表に結合します。このタイプの問合せは、大量のデータをスキャンし、オプションでフィルタ処理を行い、1列から40列までのGROUP BY
を実行します。ファクト表での最初の集計で、ほとんどの行が処理されます。
Oracle Database 12cより前は、GROUP BY
操作はHASH
およびSORT
のみでした。VECTOR GROUP BY
は、ディメンション表とファクト表との結合をフィルタに変換する、追加のコストベースの変換です。データベースでは、ファクト表のスキャン中にこのフィルタを適用できます。結合では、ブルーム・フィルタに似たキー・ベクターが使用され、集計では、VECTOR GROUP BY
が使用されます。
ノート:
ベクター変換はIM列ストアから独立していますが、SIMDベクター処理によってそれらをインメモリー・データに非常に効率的に適用できます。
IM集計により、ベクトル結合およびGROUP BY
操作を、大きな表のスキャンと同時に行うことができるようになります。したがって、これらの操作では、スキャンしながら集計されるため、表のスキャンおよび結合操作の完了を待つ必要はありません。IM集計では、CPU使用率、特にCPUキャッシュが最適化されます。
IM集計により、問合せのパフォーマンスを大幅に改善できます。データベースでは、動的にレポート概要を作成し、ファクト表のスキャン中にレポート詳細を入力できます。
この項では、次の項目について説明します。
関連項目:
-
問合せ変換についてさらに学習するには、Oracle Database SQLチューニング・ガイドを参照
8.1.2.1 IM集計が役立つ場合
IM集計により、比較的小さい表を比較的大きい表に結合してファクト表内のデータを集計する問合せのパフォーマンスが向上します。これは通常、スター・クエリーまたはスノーフレーク・クエリーで起こります。
行ストア表およびIM列ストア内の表の両方に、IM集計が役立ちます。
例8-1 VECTOR GROUP BY
customers
ディメンション表とsales
ファクト表の結合を実行する、次のような問合せを想定します。
SELECT c.customer_id, s.quantity_sold, s.amount_sold
FROM customers c, sales s
WHERE c.customer_id = s.customer_id
AND c.country_id = 'FR';
両方の表がIM列ストアに移入される場合、データベースでは、SIMDベクター処理を使用して、行セットをスキャンし、フィルタを適用できます。次の図では、ベクトル結合が問合せでどのように使用されるかを示します。オプティマイザにより、customers
表の述語、c.country_id='FR'
が、sales
ファクト表上のフィルタに変換されます。フィルタはcountry_id='FR'
です。sales
は列形式で格納されるため、問合せでは、結果を決定するために1列のスキャンしか必要になりません。
8.1.2.2 IM集計が役立たない場合
IM集計は、十分なシステム・リソースが存在する場合に、特定のスター・クエリーに役立ちます。他の問合せには、ほとんどまたはまったく利益がない場合があります。
VECTOR GROUP BY集計が不利な状況
具体的に述べると、VECTOR GROUP BY
集計は、次のシナリオにおいてはパフォーマンス向上に役立ちません。
-
2つの非常に大きな表の間で結合が実行される。
デフォルトでは、比較的小さい表が比較的大きい表に結合される場合のみ、オプティマイザで
VECTOR GROUP BY
変換が選択されます。 -
ディメンションに、20億以上の行が含まれる。
ディメンションに20億以上の行が含まれる場合、
VECTOR GROUP BY
変換は使用されません。 -
システムに十分なメモリーがない。
IM列ストアを使用するほとんどのデータベースには、IM集計が役立ちます。
8.1.3 IM集計はどのように機能するか
一般的な分析問合せでは、複数の処理ステージ間で行が分散されます。
次のようなステージがあります。
-
表のフィルタ処理と行セットの生成
-
行セットの結合
-
行の集計
VECTOR GROUP BY
変換では、様々なステージでの処理を組み合せて、結合をフィルタに変換し、ファクト表をスキャンしながら集計します。
ステージ間の作業単位をデータ・フロー演算子(DFO)と呼びます。VECTOR GROUP BY
集計では、ディメンションごとにDFOを使用して、キー・ベクター構造と一時表を作成します。ファクト表のメジャー列を集計する場合、データベースではこのキー・ベクターを使用して、ファクト結合キーをその稠密グループ化キーに変換します。遅延マテリアライズ・ステップは、稠密グループ化キーで一時表に結合します。
この項では、次の項目について説明します。
8.1.3.1 オプティマイザでIM集計が選択される場合
オプティマイザでは、キー・ベクター(つまり、非重複結合キー)のサイズ、非重複グループ化キーの数、およびその他の要因に基づいて、ベクター変換を使用するかどうかが決定されます。ディメンション結合キーのカーディナリティが低い場合に、オプティマイザはこの変換を選択する傾向があります。
Oracle Databaseは、次の条件が満たされた場合、VECTOR GROUP BY
集計を使用してデータ集計を実行します。
-
問合せまたは副問合せは、ファクト表からのデータを集計し、ファクト表を1つ以上のディメンションに結合します。
これらのファクト表が結合のみを介してディメンションに接続されているという想定では、同じディメンションに結合された複数のファクト表もサポートされます。この場合、
VECTOR GROUP BY
はファクト表を別々に集計し、グループ化キー上で結果を結合します。 -
ディメンションとファクト表は、結合列を介してのみ互いに接続されます。
特に、問合せには、複数のディメンションを通じて、またはディメンションとファクト表から、列を参照する述語が他にないようにする必要があります。問合せが2つ以上の表の間の結合を実行し、結果をファクトに結合する場合、
VECTOR GROUP BY
集計は、複数のディメンションを1つのディメンションとみなします。
ノート:
問合せブロックのヒントまたは表ヒントを使用して、問合せに対してVECTOR GROUP BY
集計を使用するようにデータベースに指示できます。
VECTOR GROUP BY
集計は、次の場合をサポートしていません。
-
複数のディメンションの間、またはディメンション表とファクト表の間の半結合と逆結合
-
複数のディメンションの間の等価結合
-
DISTINCT
関数を使用して実行される集計
ノート:
ブルーム・フィルタおよびVECTOR GROUP BY
集計は互いに矛盾します。そのため、問合せでブルーム・フィルタを使用して行セットを結合する場合は、この問合せの処理にVECTOR GROUP BY
集計を適用できません。
関連項目:
SQL集計についてさらに学習するには、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照
8.1.3.2 キー・ベクター
キー・ベクターは、稠密結合キーと稠密グループ化キー間をマップするデータ構造です。
稠密キーは、ネイティブ整数として格納され、値の範囲を持つ数値キーです。稠密結合キーは、結合列が特定のファクト表またはディメンションから取得されるすべての結合キーを表します。稠密グループ化キーは、グループ化列が特定のファクト表またはディメンションから取得されるすべてのグループ化キーを表します。キー・ベクターは、高速参照を可能にします。
例8-2 キー・ベクター
hr.locations
表に、次のようなcountry_id
の値があるとします(結果のうち冒頭の一部のみを示しています)。
SQL> SELECT country_id FROM locations;
CO
--
IT
IT
JP
JP
US
US
US
US
CA
CA
CN
複合分析問合せは、フィルタWHERE country_id='US'
をlocations
表に適用します。このフィルタのキー・ベクターは、次の1次元配列のようになります。
0
0
0
0
1
1
1
1
0
0
0
前の配列では、1
はcountry_id='US'
の稠密グループ化キーです。0
の値は、このフィルタに一致しないlocations
の行を示します。問合せでフィルタWHERE country_id IN ('US','JP')
を使用する場合、配列は次のようになります。ここで、2
はJP
の稠密グループ化キー、1
はUS
の稠密グループ化キーです。
0
0
2
2
1
1
1
1
0
0
0
8.1.3.3 インメモリー集計の2つのフェーズ
一般に、VECTOR GROUP BY
集計では、各ディメンションが順々に処理されてから、ファクト表が処理されます。
インメモリー集計を実行する場合、データベースは次のように処理を行います。
-
各ディメンションを次の順序で処理します。
-
一意の稠密グループ化キーを検索します。
-
キー・ベクターを作成します。
-
一時表(
CURSOR DURATION MEMORY
)を作成します。
次の図では、DFO 0のディメンション表のスキャンで開始し、一時表の作成で終了する、このフェーズのステップを示します。最も単純な形式のパラレル
GROUP BY
または結合処理では、データベースは自身のDFO内で各結合またはGROUP BY
を処理します。 -
-
ファクト表を処理します。
-
前のフェーズで作成したキー・ベクターを使用して、すべての結合と集計を処理します。
-
結果を各一時表に再び結合します。
図8-3に、2つのディメンションがあるファクト表の結合のフェーズ2を示します。DFO 0では、データベースはファクト表の全スキャンを実行し、各ディメンションのキー・ベクターを使用して不一致の行をフィルタで除外します。DFO 2は、DFO 0の結果をDFO 1と結合します。DFO 4は、DFO 2の結果をDFO 3と結合します。
-
8.1.3.4 IM集計: シナリオ
この項では、VECTOR
GROUP BY
集計の仕組みの概念的な例を示します。
ノート:
シナリオに使用しているスキーマ表はサンプルではなく、表示されている実行計画も実際のものではありません。
この項では、次の項目について説明します。
8.1.3.4.1 スター・スキーマのサンプル分析問合せ
このシナリオのサンプル・スター・スキーマには、sales_online
ファクト表と、2つのディメンション表geography
およびproducts
が含まれます。
geography
の各行は、geog_id
列で一意に識別されます。products
の各行は、prod_id
列で一意に識別されます。sales_online
の各行は、geog_id
列、prod_id
列および販売量で一意に識別されます。
表8-1 geography表のサンプル行
国 | 州 | 市 | geog_id |
---|---|---|---|
USA |
WA |
seattle |
2 |
USA |
WA |
spokane |
3 |
USA |
CA |
SF |
7 |
USA |
CA |
LA |
8 |
表8-2 products表のサンプル行
製造者 | カテゴリ | サブカテゴリ | prod_id |
---|---|---|---|
Acme |
スポーツ |
バイク |
4 |
Acme |
スポーツ |
ボール |
3 |
Acme |
電気 |
電球 |
1 |
Acme |
電気 |
スイッチ |
8 |
表8-3 sales_online表のサンプル行
prod_id | geog_id | 量 |
---|---|---|
8 |
1 |
100 |
9 |
1 |
150 |
8 |
2 |
100 |
4 |
3 |
110 |
2 |
30 |
130 |
6 |
20 |
400 |
3 |
1 |
100 |
1 |
7 |
120 |
3 |
8 |
130 |
4 |
3 |
200 |
仕事上でマネージャに、「各サブカテゴリのAcme製品が、ワシントンでオンライン販売された数と、カリフォルニアで販売された数はいくつだったか」と聞かれたとします。この質問に答えるには、sales_online
ファクト表の分析問合せでproducts
およびgeography
ディメンション表を次のように結合します。
SELECT p.category, p.subcategory, g.country, g.state, SUM(s.amount)
FROM sales_online s, products p, geography g
WHERE s.geog_id = g.geog_id
AND s.prod_id = p.prod_id
AND g.state IN ('WA','CA')
AND p.manuf = 'ACME'
GROUP BY category, subcategory, country, state
8.1.3.4.2 ステップ1: geographyディメンションのキー・ベクターと一時表の作成
この問合せのVECTOR GROUP BY
集計の最初のフェーズでは、データベースはワシントンまたはカリフォルニア州の市について、各市/州の組合せに対する稠密グループ化キーを作成します。
表8-6では、1
はUSA,WA
グループ化キーで、2
はUSA,CA
グループ化キーです。
表8-4 geographyの稠密グループ化キー
国 | 州 | 市 | geog_id | dense_gr_key_geog |
---|---|---|---|---|
USA |
WA |
seattle |
2 |
1 |
USA |
WA |
spokane |
3 |
1 |
USA |
CA |
SF |
7 |
2 |
USA |
CA |
LA |
8 |
2 |
geography
表のキー・ベクターは、表8-5の最後の列で表される配列のようになります。値は、geography
稠密グループ化キーです。したがって、キー・ベクターは、sales_online
のどの行がgeography.state
フィルタ基準(CA
またはWA
の州の販売)を満たし、各行がどの国/州グループ(USA、WA
グループまたはUSA、CA
グループ)に属するかを示します。
表8-5 オンライン販売
prod_id | geog_id | 量 | geographyのキー・ベクター |
---|---|---|---|
8 |
1 |
100 |
0 |
9 |
1 |
150 |
0 |
8 |
2 |
100 |
1 |
4 |
3 |
110 |
1 |
2 |
30 |
130 |
0 |
6 |
20 |
400 |
0 |
3 |
1 |
100 |
0 |
1 |
7 |
120 |
2 |
3 |
8 |
130 |
2 |
4 |
3 |
200 |
1 |
内部的に、データベースは次のような一時表を作成します。
CREATE TEMPORARY TABLE tt_geography AS SELECT MAX(country), MAX(state), KEY_VECTOR_CREATE(...) dense_gr_key_geog FROM geography WHERE state IN ('WA','CA') GROUP BY country, state
表8-6に、tt_geography
一時表の行を示します。USA、WA
の組合せに対する稠密グループ化キーは1
で、USA、CA
の組合せに対する稠密グループ化キーは2
です。
表8-6 tt_geography
国 | 州 | dense_gr_key_geog |
---|---|---|
USA |
WA |
1 |
USA |
CA |
2 |
8.1.3.4.3 ステップ2: productsディメンションのキー・ベクターと一時表の作成
データベースでは、Acme製品の個々のカテゴリ/サブカテゴリの組合せに対して稠密グループ化キーが作成されます。
たとえば、表8-7では、4
がAcme electric switchの稠密グループ化キーです。
表8-7 products表のサンプル行
製造者 | カテゴリ | サブカテゴリ | prod_id | dense_gr_key_prod |
---|---|---|---|---|
Acme |
スポーツ |
バイク |
4 |
1 |
Acme |
スポーツ |
ボール |
3 |
2 |
Acme |
電気 |
電球 |
1 |
3 |
Acme |
電気 |
スイッチ |
8 |
4 |
products
表のキー・ベクターは、表8-8の最後の列で表される配列のようになります。値は、products
稠密グループ化キーを表します。たとえば、4
はAcme electric switchのオンライン販売を表します。したがって、キー・ベクターは、sales_online
のどの行がproducts
フィルタ基準(Acme製品の販売)を満たすかを示します。
表8-8 キー・ベクター
prod_id | geog_id | 量 | productsのキー・ベクター |
---|---|---|---|
8 |
1 |
100 |
4 |
9 |
1 |
150 |
0 |
8 |
2 |
100 |
4 |
4 |
3 |
110 |
1 |
2 |
30 |
130 |
0 |
6 |
20 |
400 |
0 |
3 |
1 |
100 |
2 |
1 |
7 |
120 |
3 |
3 |
8 |
130 |
2 |
4 |
3 |
200 |
1 |
内部的に、データベースは次のような一時表を作成します。
CREATE TEMPORTARY TABLE tt_products AS SELECT MAX(category), MAX(subcategory), KEY_VECTOR_CREATE(...) dense_gr_key_prod FROM products WHERE manuf = 'ACME' GROUP BY category, subcategory
表8-9に、この一時表の行を示します。
表8-9 tt_products
カテゴリ | サブカテゴリ | dense_gr_key_prod |
---|---|---|
スポーツ |
バイク |
1 |
スポーツ |
ボール |
2 |
電気 |
電球 |
3 |
電気 |
スイッチ |
4 |
8.1.3.4.4 ステップ3: キー・ベクター問合せ変換
このフェーズでは、データベースはファクト表を処理します。
オプティマイザは、元の問合せを、キー・ベクターにアクセスする次の同等の問合せに変換します。
SELECT KEY_VECTOR_PROD(prod_id),
KEY_VECTOR_GEOG(geog_id),
SUM(amount)
FROM sales_online
WHERE KEY_VECTOR_PROD_FILTER(prod_id) IS NOT NULL
AND KEY_VECTOR_GEOG_FILTER(geog_id) IS NOT NULL
GROUP BY KEY_VECTOR_PROD(prod_id), KEY_VECTOR_GEOG(geog_id)
前の変換は、はるかに複雑な内部SQLの正確なレンディションではなく、基本概念を示すように設計された概念的な表現です。
8.1.3.4.5 ステップ4: ファクト表からの行フィルタ
このフェーズでは、グループ化キーの各組合せの販売量を取得します。
データベースは、キー・ベクターを使用して、ファクト表から不要な行をフィルタで除外します。表8-10では、最初の3列がsales_online
表を表します。最後の2列は、geography
およびproducts
表の稠密グループ化キーを提供します。
表8-10 sales_online表の稠密グループ化キー
prod_id | geog_id | 量 | dense_gr_key_prod | dense_gr_key_geog |
---|---|---|---|---|
7 |
1 |
100 |
4 |
|
9 |
1 |
150 |
||
8 |
2 |
100 |
4 |
1 |
4 |
3 |
110 |
1 |
1 |
2 |
30 |
130 |
||
6 |
20 |
400 |
||
3 |
1 |
100 |
2 |
|
1 |
7 |
120 |
3 |
2 |
3 |
8 |
130 |
2 |
2 |
4 |
3 |
200 |
1 |
1 |
表8-11に示すように、データベースはsales_online
から、どちらの稠密グループ化キーもnull値でない行のみを取得しており、すべてのフィルタ基準を満たす行が示されています。
表8-11 sales_online表からフィルタされた行
geog_id | prod_id | 量 | dense_gr_key_prod | dense_gr_key_geog |
---|---|---|---|---|
2 |
8 |
100 |
4 |
1 |
3 |
4 |
110 |
1 |
1 |
3 |
4 |
200 |
1 |
1 |
7 |
1 |
120 |
3 |
2 |
8 |
3 |
130 |
2 |
2 |
8.1.3.4.6 ステップ5: 配列を使用した集計
データベースでは、多次元配列を使用して集計を実行します。
表8-12では、geography
グループ化キーは水平で、products
グループ化キーは垂直です。データベースは、各稠密グループ化キーの組合せの交差部分の値を加算します。たとえば、geography
グループ化キー1
とproducts
グループ化キー1
の交差部分では、110
と200
の合計は310
です。
表8-12 集計配列
dgkp/dgkg | 1 | 2 |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
8.1.4 IM集計の制御
IM集計は、オプティマイザと統合されます。新しいSQLまたは初期化パラメータが必要となります。IM集計には、追加の索引、外部キーまたはディメンションは不要です。
次のヒントのペアを使用できます。
-
問合せブロック・ヒント
VECTOR_TRANSFORM
では、コストにかかわらず、指定した問合せブロックに対してベクター変換を有効にします。NO_VECTOR_TRANSFORM
は、指定した問合せブロックからのベクター変換を無効にします。 -
表ヒント
次のヒントのペアを使用できます。
-
VECTOR_TRANSFORM_FACT
では、ベクター変換で生成されたファクト表に、指定したFROM
式が含まれます。NO_VECTOR_TRANSFORM_FACT
では、ベクター変換で生成されたファクト表から、指定したFROM
式が除外されます。 -
VECTOR_TRANSFORM_DIMS
では、ベクター変換で生成された有効なディメンションに、指定したFROM
式が含まれます。NO_VECTOR_TRANSFORM_DIMS
では、ベクター変換で生成された有効なディメンションから、指定したFROM式が除外されます。
-
関連項目:
VECTOR_TRANSFORM_FACT
およびVECTOR_TRANSFORM_DIMS
ヒントについてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。
8.1.5 インメモリー集計: 例
この例では、仕事上の問いは「各カレンダ年に販売されたカテゴリごとの製品数はいくつか」というものです。
times
、products
およびsales
表を結合する、次のような問合せを記述します。
SELECT t.calendar_year, p.prod_category, SUM(quantity_sold)
FROM times t, products p, sales s
WHERE t.time_id = s.time_id
AND p.prod_id = s.prod_id
GROUP BY t.calendar_year, p.prod_category;
例8-3 VECTOR GROUP BY実行計画
次の例に、現在のカーソルに含まれる実行計画を示します。ステップ4と8では、ディメンション表times
およびproducts
のキー・ベクターを作成しています。ステップ17と18では、前に作成したキー・ベクターを使用しています。ステップ15では、VECTOR GROUP BY
操作を行っています。
----------------------------------------------------------
Execution Plan
----------------------------------------------------------
Plan hash value: 2093829546
-------------------------------------------------------------------------------------------------------------------
|Id| Operation | Name |Rows|Bytes|Cost(%CPU)|Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------
|0 |SELECT STATEMENT | | 18 | 1116|302(90)|00:00:01| | |
|1 | TEMP TABLE TRANSFORMATION | | | | | | | |
|2 | LOAD AS SELECT (CURSOR DURATION MEMORY)|SYS_TEMP_0FD9D6608_F6A13| | | | | | |
|3 | HASH GROUP BY | | 5 | 80 | 3 (67)|00:00:01| | |
|4 | KEY VECTOR CREATE BUFFERED | :KV0000 | 5 | 80 | 2 (50)|00:00:01| | |
|5 | TABLE ACCESS INMEMORY FULL | TIMES |1826|21912| 2 (50)|00:00:01| | |
|6 | LOAD AS SELECT (CURSOR DURATION MEMORY)|SYS_TEMP_0FD9D6607_F6A13| | | | | | |
|7 | HASH GROUP BY | | 5 | 125 | 2 (50)|00:00:01| | |
|8 | KEY VECTOR CREATE BUFFERED | :KV0001 | 5 | 125 | 1 (0)|00:00:01| | |
|9 | TABLE ACCESS INMEMORY FULL | PRODUCTS | 72 |1512 | 1 (0)|00:00:01| | |
|10| HASH GROUP BY | | 18 |1116 |297(91)|00:00:01| | |
|11| HASH JOIN | | 18 |1116 |296(91)|00:00:01| | |
|12| HASH JOIN | | 18 | 666 |294(91)|00:00:01| | |
|13| TABLE ACCESS FULL |SYS_TEMP_0FD9D6608_F6A13| 5 | 80 | 2 (0)|00:00:01| | |
|14| VIEW | VW_VT_0737CF93 | 18 | 378 |291(92)|00:00:01| | |
|15| VECTOR GROUP BY | | 18 | 414 |291(92)|00:00:01| | |
|16| HASH GROUP BY | | 18 | 414 |291(92)|00:00:01| | |
|17| KEY VECTOR USE | :KV0000 |918K| 20M |285(92)|00:00:01| | |
|18| KEY VECTOR USE | :KV0001 |918K| 16M |284(92)|00:00:01| | |
|19| PARTITION RANGE ITERATOR | |918K| 13M |282(92)|00:00:01|:KV0000|:KV0000|
|20| TABLE ACCESS INMEMORY FULL | SALES |918K| 13M |282(92)|00:00:01|:KV0000|:KV0000|
|21| TABLE ACCESS FULL |SYS_TEMP_0FD9D6607_F6A13| 5 | 125 | 2 (0)|00:00:01| | |
-------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
11 - access("ITEM_9"=INTERNAL_FUNCTION("C0"))
12 - access("ITEM_8"=INTERNAL_FUNCTION("C0"))
20 - inmemory(SYS_OP_KEY_VECTOR_FILTER("S"."PROD_ID",:KV0001) AND SYS_OP_KEY_VECTOR_FILTER("S"."TIME_ID",:KV0000))
filter(SYS_OP_KEY_VECTOR_FILTER("S"."PROD_ID",:KV0001) AND SYS_OP_KEY_VECTOR_FILTER("S"."TIME_ID",:KV0000))
Note
-----
- vector transformation used for this statement
Statistics
----------------------------------------------------------
26 recursive calls
13 db block gets
124 consistent gets
67 physical reads
2200 redo size
1454 bytes sent via SQL*Net to client
634 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
20 rows processed
8.2 インメモリー算術の最適化
インメモリー最適化算術では、SIMDハードウェアを使用して、最適化されたNUMBER
フォーマットを使用して高速計算を行います。
この項では、次の項目について説明します。
8.2.1 インメモリー最適化算術について
インメモリー最適化されたNUMBER
形式により、SIMDハードウェアを使用した高速計算が可能になります。
QUERY LOW
で表を圧縮する場合、NUMBER
列は、ハードウェアでのネイティブ計算が有効になる最適化された形式を使用してエンコードされます。SIMDベクター処理では、単純な集計、GROUP BY
集計、算術演算を使用でき、大きいメリットがあります。パフォーマンスの向上は、集計が算術計算に費やす時間によって異なります。集計によっては、最大9倍までの効果があります。
問合せ処理エンジンのすべての行ソースで、インメモリー最適化数値形式がサポートされているわけではありません。したがって、IM列ストアには、Oracle Databaseの従来のNUMBER
データ型とインメモリー最適化数値型の両方を格納する必要があります。この二重記憶域は、領域のオーバーヘッドを場合によっては最大15%まで増加させます。
関連項目:
8.2.2 インメモリー最適化算術の有効化と無効化
初期化パラメータINMEMORY_OPTIMIZED_ARITHMETIC
をDISABLE
(デフォルト)またはENABLE
に設定することにより、機能を制御します。
ENABLE
に設定すると、Oracle Databaseは、FOR QUERY LOW
圧縮を使用する表のNUMBER
列のインメモリー最適化コーディングを使用します。DISABLE
に設定すると、データベースは、最適化されたエンコーディングを使用しません。
ENABLE
からDISABLE
に切り替えても、既存のIMCUの最適化された数値エンコーディングはすぐには削除されません。かわりに、IM列ストアがIMCUを再移入するので、新しいIMCUは最適化されたエンコーディングを使用しません。
インメモリー最適化算術を有効または無効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
ALTER SYSTEM
文を使用して、INMEMORY_OPTIMIZED_ARITHMETIC
を指定します。次の例では、インメモリー最適化算術を有効にしています。
ALTER SYSTEM SET INMEMORY_OPTIMIZED_ARITHMETIC = 'ENABLE' SCOPE=BOTH;
関連項目:
INMEMORY_OPTIMIZED_ARITHMETIC
初期化パラメータについてさらに学習するには、Oracle Databaseリファレンスを参照