アクアシステムズは、データベース領域のパイオニアとして様々なプロダクトをリサーチ&検証しています。 今、データベースはIT技術の中でも有数のエキサイティングなエリアです。私たちがこれまで取り組んできた調査、検証、方法論の研究を、皆さんのお役に立つよう発信していきたいと思います。

Oracle12c 新機能

2016.12.26
第4回「Oracle12c (12.1.0.2) 属性Clustering

[ 著者:吉田 宗弘]

前の記事

1. Introduction

1.1 はじめに

2014年7月にリリースされたOracle 12c Release 1に対する最終のPSR (12.1.0.2) には、不具合修正や既存機能の強化だけでなく、DWH 系の処理性能を大幅に向上させる機能が追加されています。12.1.0.2 の新機能と言うと、In-Memory Option に注目が集まっていますが、それ以外にも12.1.0.2 で新たに実装された新機能が数多くあります。その中でも今回は、単体で使用した場合には余り効果はないものの、基本表圧縮やZone Maps, HCC, In-Memory Option等の機能と併用した時に効果の大きい属性Clusteringについて検証を行います。
※ Zone Maps, HCC (Hybrid Columnar Compression) の各機能についてはExadata

又は Super Cluster環境が必要となるため、今回は検証を行っていません。

1.2 属性Clustering の特徴

属性Clustering には、以下の特徴があります。
・Oracle 12.1.0.2 の新機能で、使用するためにはEnterprise Editionが必要です。
・/*+ APPEND */ を指定したINSERT や表領域の移動等、Direct処理を行った際に
指定された項目でSort 処理を行い、近い値を持つデータを隣接した領域に格納します。これによって、基本表圧縮, Zone Maps, HCC, In-Memory Option 等の機能と併用した場合に、必要となる領域やメモリを大幅に削減する効果があります。
・Clustering が動作するのは、Direct処理が行われた場合のみで、通常のDML に
は影響を与えません。
・属性Clustering が動作するタイミングとして、LOAD (Insert の結果として実行
されるDirect Insert), DATA MOVEMENT (DBMS_REDEFINITION Package
を使用したテーブル再定義, Alter Table を使用した表領域移動) の2つを指定可能。
※ マニュアル (SQL リファレンス) では、どちらも禁止 (NO LOAD, NO DATA
MOVEMENT がデフォルトと記載されていますが、実際はどちらも有効 (YES LOAD, YES DATA MOVEMENT) がデフォルトとなっています。
・Clustering の方法はLinear Order, Interleaved Order の2種類が用意されている。
  Linear Order は単一表での使用、Interleaved Order は結合表での使用が推奨され  
 ている。
・Linear Order は最大で10列をClustering 列として指定可能。Interleaved Order で

は最大40列を使用した最大4つのClustering 列グループが指定可能です。

1.3 属性 Clustering 使用時の注意点

属性 Clustering を定義しているテーブルに対して表領域の移動やDirect Load 等処理を行うと、内部でSort 処理が行われます。そのため属性Clustering を定義しているテーブルに対して大量のDirect 処理を行う場合は、一時表領域のサイズが十分に確保されていないと、以下のように、処理が異常終了してしまう可能性があるので注意が必要です。更にこれまでは行われなかったSort 処理が行われる事による処理時間の増加も注意する必要があります。

SQL> alter table sales move compress;
alter table sales move compress
*
行1でエラーが発生しました。:

ORA-01652: 一時セグメントを拡張できません(640分、表領域TEMP)。

[注意事項]

マニュアルでは、Merge 文によって実行されるDirect Insert でも属性Clustering が機能するように記載されていますが、実際にはMerge 文, Multitable Insert 操作では属性Clustering は機能しません。


1.4 関連するディクショナリ

属性Clustering に関連するディクショナリは、DBA_CLUSTERING_TABLES です。それでは属性Clustering に関連する、ディクショナリを確認してみましょう。

SQL> desc dba_clustering_tables
 名前                   NULL?    型
 ------------------------ -------- -----------------
 OWNER                    NOT NULL VARCHAR2(128)
 TABLE_NAME               NOT NULL VARCHAR2(128)
 CLUSTERING_TYPE                    VARCHAR2(11)
 ON_LOAD                              VARCHAR2(3)
 ON_DATAMOVEMENT                   VARCHAR2(3)
 VALID                                 VARCHAR2(3)
 WITH_ZONEMAP                       VARCHAR2(3)
 LAST_LOAD_CLST                     TIMESTAMP(6)
 LAST_DATAMOVE_CLST                TIMESTAMP(6)

[列の説明]
OWNER                : 属性 Clustering が定義されているテーブルの所有者
TABLE_NAME          : 属性 Clustering が定義されているテーブル名
CLUSTERING_TYPE     : 属性 Clustering のタイプ (INTERLEAVED or LINEAR)
ON_LOAD             : データロード時にClustering されるかどうか (YES or NO)
ON_DATAMOVEMENT     : データ移動時にClustering されるかどうか (YES or NO)
VALID               : 属性 Clustering が有効かどうか (YES or NO)
WITH_ZONEMAP        : Zone Map と 属性 Clustering が併用されるかどうか (YES or NO)
LAST_LOAD_CLST      : データロードによるClustering が行われた最終時刻
LAST_DATAMOVE_CLST  : データ移動によるClustering が行われた最終時刻


2. 属性 Clustering の詳細

2.1 属性Clustering の基本動作

それでは実際に、属性Clustering を使用した際にどの程度の効果があるか確認してみましょう。先に記載した通り、属性 Clustering は単体で何らかの効果が確認できる機能ではないので、基本表圧縮, In-Memory Option と併用した際に、どの程度領域, メモリ使用量が削減されるかで確認を行いました。データの圧縮率については、実際に使用されるデータや、データのバラツキにより差異があるため、あくまで参考値としてご理解下さい。


SQL> drop table Products purge;
SQL> Create table Products (
        ProductID    number(8)    NOT NULL,
        ProductName  varchar2(32) NOT NULL,
        ReleaseDate  date,
        UnitPrice    number(8),
        Description  varchar2(256),
        constraint pk_products Primary Key (ProductID)
     );

SQL> drop table Customers purge;
SQL> Create table Customers (
       CustomerID    number(8)     NOT NULL,
       CountryCode   varchar2(2)   NOT NULL,
       Address       varchar2(128),
       CustomerName  varchar2(32),
       MailAddress   varchar2(32),
       UserComment   varchar2(256),
       constraints pk_customers Primary Key (CustomerID)
     );
-- Interleaved Order
SQL> drop table sales purge;
SQL> Create table Sales (
       ProductID     number(8)    NOT NULL,
       CountryCode   varchar2(2)  NOT NULL,
       CustomerID    number(8)    NOT NULL,
       SalesDate     date         NOT NULL,
       SalesCount    number(8),
       SalesAmount   number(8),
       Description   varchar2(256),
       UserComment   varchar2(256),
       constraints pk_sales Primary Key (ProductID, CustomerID, SalesDate)
     )
     Clustering Sales
         Join Products  on (sales.ProductID  = Products.ProductID)
         Join Customers on (sales.CustomerID = Customers.CustomerID)
       BY Interleaved order ((Products.ProductID),

(Customers.CountryCode, Customers.CustomerID));

-- Linear Order
SQL> drop table sales2 purge;
SQL> Create table Sales2 (
       ProductID     number(8)    NOT NULL,
       CountryCode   varchar2(2)  NOT NULL,
       CustomerID    number(8)    NOT NULL,
       SalesDate     date         NOT NULL,
       SalesCount    number(8),
       SalesAmount   number(8),
       Description   varchar2(256),
       UserComment   varchar2(256),
       constraints pk_sales2 Primary Key (ProductID, CustomerID, SalesDate)
     )
     Clustering By Linear order (ProductID, CountryCode, CustomerID);

-- テスト用テーブルにデータセット
SQL> Truncate table products;
SQL> begin
       dbms_random.seed(to_char(systimestamp));
       for v1 in 1..100 loop
         insert into Products (ProductID, ProductName, ReleaseDate,
UnitPrice, Description)
           values (1000+v1, 'ProductName#' || to_char(v1), sysdate -1,
100*v1, dbms_random.string('p', 256));
       end loop;
       commit;
     end;
     /

SQL> truncate table Customers;
SQL> begin
       dbms_random.seed(to_char(systimestamp));
       for v1 in 1..1000 loop
         insert into Customers (CustomerID, CountryCode, Address,
CustomerName, MailAddress, UserComment)
           values (10000+v1, decode(mod(v1,4), 0, 'AR', 1, 'JA', 2, 'US', 3, 'SA'),
             'Addres#' || to_char(v1) || ':' || dbms_random.string('p', 100),
             'Customer#' || to_char(v1),
             'Mail' || to_char(v1) || '@aqua-systems.co.jp',
dbms_random.string('p', 256));
       end loop;
       commit;
     end;
     /


SQL> truncate table sales;
SQL> declare
       vProd_ID     Sales.ProductID%TYPE;
       vCust_ID     Sales.CustomerID%TYPE;
       vCount       Sales.SalesCount%TYPE;
       vUnit_Price  Products.UnitPrice%TYPE;
       vDescription Products.Description%TYPE;
       vCountryCode Customers.CountryCode%TYPE;
       vComment     Customers.UserComment%TYPE;
     begin
       dbms_random.seed(to_char(systimestamp));
       for v1 in 1..2000000 loop
         vProd_ID := trunc(dbms_random.value(1001, 1101));
         vCust_ID := trunc(dbms_random.value(10001,11001));
         vCount   := trunc(dbms_random.value(1,11));
         Select UnitPrice, Description into vUnit_Price, vDescription from Products
           where ProductID = vProd_ID;
         Select CountryCode, UserComment into vCountryCode, vComment from Customers
           where CustomerID = vCust_ID;
         Insert into Sales (ProductID, CountryCode, CustomerID, SalesDate,
           SalesCount, SalesAmount, Description, UserComment)
           values (vProd_ID, vCountryCode, vCust_ID, sysdate - v1/86400, vCount,
             vUnit_Price * vCount, vDescription, vComment);
         if (mod(v1, 10000) = 0) then
           commit;
         end if;
       end loop;
       commit;
     end;
     /

-- Sales2 (Linear Order), Sales3 (非Clustering 表) にデータ投入
SQL> Insert into sales2 select * from sales nologging;
SQL> Create table sales3 as select * from sales nologging;
SQL> commit;

-- データ確認
SQL> select count(*) from sales;
  COUNT(*)
----------
   2000000

SQL> select count(*) from sales2;
  COUNT(*)
----------
   2000000

SQL> select count(*) from sales3;
  COUNT(*)
----------

   2000000

-- 容量確認
SQL> select s.segment_name as table_name, s.bytes/1048576 as mbyte,
       t.compression, t.compress_for
       from user_segments s, user_tables t
       where s.segment_type = 'TABLE'
         and s.segment_name = t.table_name
       order by 1;

TABLE_NAME         MBYTE COMPRESSIO COMPR
--------------- -------- ---------- -----
CUSTOMERS            0.6 DISABLED
PRODUCTS             0.1 DISABLED
SALES             1216.0 DISABLED
SALES2            1216.0 DISABLED
SALES3            1207.0 DISABLED

-- 属性Clustering の設定確認
SQL> select * from dba_clustering_tables;
OWNER  TABLE_ CLUSTERING_T ON_LO ON_ VALID WITH_ LAST_LOAD_CLST       LAST_DATAMOVE_CLST
------ ------ ------------ ----- --- ----- ----- -------------------- --------------------
SCOTT  SALES2 LINEAR       YES   YES YES   NO
SCOTT  SALES  INTERLEAVED  YES   YES YES   NO
→ デフォルトで属性 Clustering を定義しましたが、ON_LOAD, ON_MOVEMENT はYES と
   なっています。

-- 基本表圧縮との併用を確認
-- データ移動を実行し、Clustering を実行させます。
SQL> alter table sales move compress;
SQL> alter table sales2 move compress;
SQL> alter table sales3 move compress;
SQL> alter index pk_sales rebuild;
SQL> alter index pk_sales2 rebuild;

-- 各テーブルの容量, 圧縮属性を確認
SQL> select s.segment_name as table_name, s.bytes/1048576 as mbyte,
      t.compression, t.compress_for, c.clustering_type
      from user_segments s, user_tables t, user_clustering_tables c
      where s.segment_type = 'TABLE'
        and s.segment_name = t.table_name
        and s.segment_name = c.table_name(+)
      order by 1;

TABLE_NAME         MBYTE COMPRESSIO COMPR CLUSTERING_T
--------------- -------- ---------- ----- ------------
CUSTOMERS            0.6 DISABLED
PRODUCTS             0.1 DISABLED
SALES               72.0 ENABLED    BASIC INTERLEAVED
SALES2              72.0 ENABLED    BASIC LINEAR
SALES3            1088.0 ENABLED    BASIC
→ 属性Clusteringと基本表圧縮を併用する事で、圧縮率が大幅に向上 (約15倍)

   する事を確認

-- In-Memory Option との併用を確認
-- 初期化パラメータに以下の設定を行い、インスタンスを再起動
-- inmemory_size=2048m

-- それぞれの表をIn-Memory 化
SQL> alter table sales inmemory priority high
        memcompress for query low;
SQL> alter table sales2 inmemory priority high
        memcompress for query low;
SQL> alter table sales3 inmemory priority high
        memcompress for query low;

SQL> select * from v$im_user_segments;
SEGMENT_NA PARTITION_ SEGMENT_TY TABLESPACE INMEMORY_SIZE         BYTES BYTES_NOT_POPULATED
---------- ---------- ---------- ---------- ------------- ------------- -------------------
POPULATE_S INMEMO INMEMORY_DISTRI INMEMORY_DUPL INMEMORY_COMPRESS     CON_ID
---------- ------ --------------- ------------- ----------------- ----------
SALES3                TABLE      USERS           40239104    1140850688                   0
COMPLETED  HIGH   AUTO            NO DUPLICATE  FOR QUERY LOW              0

SALES2                TABLE      USERS           29753344      75497472                   0
COMPLETED  HIGH   AUTO            NO DUPLICATE  FOR QUERY LOW              0

SALES                 TABLE      USERS           29687808      75497472                   0
COMPLETED  HIGH   AUTO            NO DUPLICATE  FOR QUERY LOW              0

SQL> select * from v$inmemory_area;
POOL         ALLOC_BYTES USED_BYTES POPULATE_S     CON_ID
------------ ----------- ---------- ---------- ----------
1MB POOL      1710227456   98566144 DONE                0
64KB POOL      419430400    1114112 DONE                0
→ 属性ClusteringとIn-Memory Optionを併用する事で、メモリ使用量が約74% に減少

-- テーブルのデータを確認 (Interleaved Order)
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1001 AR      10004 15-05-10          2         200
      1001 AR      10004 15-05-09          2         200
      1001 AR      10004 15-05-09          5         500
      1001 AR      10004 15-05-09          3         300
      1001 AR      10004 15-05-07          2         200
      1001 AR      10004 15-05-07         10        1000
      1001 AR      10004 15-05-06          8         800
      1001 AR      10004 15-04-30          3         300
      1001 AR      10004 15-04-28          5         500

      1001 AR      10004 15-05-02          2         200

-- テーブルのデータを確認 (Linear Order)
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales2 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1002 JA      10885 15-05-05          1         200
      1002 JA      10885 15-05-05          8        1600
      1002 JA      10885 15-05-07         10        2000
      1002 JA      10885 15-05-11          5        1000
      1002 JA      10885 15-05-10         10        2000
      1002 JA      10885 15-04-22          7        1400
      1002 JA      10885 15-04-20          7        1400
      1002 JA      10885 15-04-18         10        2000
      1002 JA      10889 15-04-19         10        2000
      1002 JA      10889 15-04-28          6        1200

-- テーブルのデータを確認 (非Clustering 表)
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales3 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000

-- 属性Clustering の状態を確認
SQL> select * from dba_clustering_tables;
OWNER  TABLE_ CLUSTERING_T ON_LO ON_ VALID WITH_ LAST_LOAD_CLST  LAST_DATAMOVE_CLST
------ ------ ------------ ----- --- ----- ----- --------------- -------------------------
SCOTT  SALES2 LINEAR       YES   YES YES   NO                    15-05-12 13:22:46.233077
SCOTT  SALES  INTERLEAVED  YES   YES YES   NO                    15-05-12 12:59:55.787551

→ データ移動によるClustering が行われた時間を確認する事ができます。


2.2 Insert /*+ APPEND */, Alter table … move 以外の処理による属性Clustering

前節では、APPEND ヒントを指定したInsert 処理, Alter table … move コマンドによるデータ移動処理によって属性Clustering が動作する状況の確認を行いました。

本節ではそれ以外の処理 (Merge, 動的再構成, impdp, SQL*Loader) と組み合わせた時に属性Clustering がどのように動作するか確認を行います。


2.2.1 Merge 文

SQL> drop table sales4 purge;
SQL> Create table Sales4 (
  ProductID     number(8)    NOT NULL,
  CountryCode   varchar2(2)  NOT NULL,
  CustomerID    number(8)    NOT NULL,
  SalesDate     date         NOT NULL,
  SalesCount    number(8),
  SalesAmount   number(8),
  Description   varchar2(256),
  UserComment   varchar2(256),
  constraints pk_sales4 Primary Key (ProductID, CustomerID, SalesDate)
)
Clustering By Linear order (ProductID, CountryCode, CustomerID);

SQL> merge /*+ APPEND_VALUES */ into sales4 t1
       using (select * from sales3) t2
        on (t1.ProductID = t2.ProductID and t1.CountryCode = t2.CountryCode and
t1.CustomerID = t2.CustomerID)
        when matched then
          update set t1.SalesDate = t2.SalesDate, t1.SalesCount = t2.SalesCount,
            t1.SalesAmount = t2.SalesAmount, t1.Description = t2.Description,
            t1.UserComment = t2.UserComment
        when not matched then
          insert (ProductID, CountryCode, CustomerID, SalesDate,
SalesCount, SalesAmount, Description, UserComment)
            values (t2.ProductID, t2.CountryCode, t2.CustomerID, t2.SalesDate,
                    t2.SalesCount, t2.SalesAmount, t2.Description, t2.UserComment);
2000000行がマージされました。

SQL> select count(*) from sales4;
行1でエラーが発生しました。:
ORA-12838: オブジェクトは、パラレルで変更された後は読取り/変更できません。
--> ダイレクト処理されている。

SQL> commit;
SQL> select count(*) from sales4;
  COUNT(*)
----------

   2000000

SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales4 where rownum <= 10;

 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000

10行が選択されました。

--> 属性Clustering は動作していない。

日本語のマニュアルには記載されていないが、英語のマニュアルのCreate table の属性Clustering の制限事項に以下のように記載されている。
http://docs.oracle.com/database/121/SQLRF/statements_7002.htm

Attribute clustering will not order rows that are inserted using MERGE statements or multitable insert operations.

→ Merge 文, Multitable Insert 操作では、属性Clustering は機能しないとの事

2.2.2 Multitable Insert 操作

前節で英語のマニュアルに、Multitable Insert 操作では属性Clustering が動作しない旨記載されている事を確認したので、本節では実際にMultitable Insert を行って属性Clustering が動作しない事を確認します。

SQL> truncate table sales4;
SQL> drop table sales5 purge;
SQL> Create table Sales5 (
       ProductID     number(8)    NOT NULL,
       CountryCode   varchar2(2)  NOT NULL,
       CustomerID    number(8)    NOT NULL,
  SalesDate     date         NOT NULL,
       SalesCount    number(8),
       SalesAmount   number(8),
       Description   varchar2(256),
       UserComment   varchar2(256),
       constraints pk_sales5 Primary Key (ProductID, CustomerID, SalesDate)
) Clustering By Linear order (ProductID, CountryCode, CustomerID);
SQL> commit;
SQL> Insert /*+ APPEND */ all
      into sales4
      into sales5
      select * from sales3;
SQL> commit;
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales4 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000
10行が選択されました。
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales5 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000
10行が選択されました。

→ マニュアルの記載通り、属性 Clustering は動作していない。


 

2.2.3  動的再構成

本節では、動的再構成 (DBMS_REDEFINITION Package) を行った時の属性Clustering の動作を確認します。

-- 現在のテーブルが動的再構成可能か確認
-- 属性Clustering が指定されていないテーブルを指定
SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','SALES3');
ORA-12089: 主キーを持たない表"SCOTT"."SALES3"のオンラインの再定義はできません。 ORA-06512:

-- 動的再構成には、Primary Key が必要なので定義して再度確認
SQL> Alter table Sales3 add primary Key (ProductID, CustomerID, SalesDate);
SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','SALES3');
PL/SQLプロシージャが正常に完了しました。
→ 動的再構成可能になった。

-- 本来はデータ型の変更等を行うが、今回は属性Clutering が定義された同じ構成の
-- Table (SALES4) を使用
SQL> Truncate table sales4;
SQL> commit;

-- 動的再定義開始
SQL> exec DBMS_REDEFINITION.START_REDEF_TABLE(uname => 'SCOTT', orig_table => 'SALES3', int_table => 'SALES4', options_flag => DBMS_REDEFINITION.CONS_USE_ROWID);

-- 同期化
SQL> exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT', 'SALES3', 'SALES4');
-- 再定義完了
SQL> exec DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT', 'SALES3', 'SALES4');

SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales3 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1001 AR      10004 15-05-09          2         200
      1001 AR      10004 15-05-09          3         300
      1001 AR      10004 15-05-09          5         500
      1001 AR      10004 15-05-10          2         200
      1001 AR      10004 15-04-27          7         700
      1001 AR      10004 15-04-26          7         700
      1001 AR      10004 15-05-03          6         600
      1001 AR      10004 15-04-25          2         200
      1001 AR      10004 15-04-28         10        1000
      1001 AR      10004 15-04-20          8         800
--> Sort されている。

SQL> select * from dba_clustering_tables;
OWNER  TABLE_NAME CLUSTERING_ ON_ ON_ VAL WIT LAST_LOAD_CLST            LAST_DATAMOVE_CLST
------ ---------- ----------- --- --- --- --- ------------------------- -------------------------
SCOTT  SALES3     LINEAR      YES YES YES NO  15-06-26 18:22:23.288680
SCOTT  SALES      INTERLEAVED YES YES YES NO                            15-05-12 12:59:55.787551
SCOTT  SALES2     LINEAR      YES YES YES NO                            15-05-12 13:22:46.233077
--> 元々属性Clustering を行っていなかったSALES3 に属性Clustering が追加されて、

    SALES3 とSALES4 の定義が交換されている。

2.2.4 expdp/impdp

-- 属性 Clustering を指定したTable 作成
SQL> Create table Load_Test (
  ProductID     number(8)    NOT NULL,
       CountryCode   varchar2(2)  NOT NULL,
       CustomerID    number(8)    NOT NULL,
       SalesDate     date         NOT NULL,
       SalesCount    number(8),
       SalesAmount   number(8),
       Description   varchar2(256),
  UserComment   varchar2(256)
)
Clustering By Linear order (ProductID, CountryCode, CustomerID);

属性 Clustering が指定されていないTable をexpdp
$ mkdir /home/oracle/datapump
SQL> Create directory dp_dir as '/home/oracle/datapump';
SQL> Create table Load_Data as select * from sales3 where rownum <= 100000;
$ expdp scott/tiger directory=dp_dir dumpfile=sample.dmp logfile=exp_sample.log tables=\(Load_Data\)
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/MARKERの処理中です
. . "SCOTT"."LOAD_DATA"             52.33 MB  100000行がエクスポートされました
マスター表"SCOTT"."SYS_EXPORT_TABLE_01"は正常にロード/アンロードされました
                                    :
ジョブ"SCOTT"."SYS_EXPORT_TABLE_01"が金 6月 19 11:29:02 2015 elapsed 0 00:01:42で正常に完 了しました

$ impdp scott/tiger directory=dp_dir dumpfile=sample.dmp logfile=imp_sample.log remap_table=Load_Data:Load_Test content=data_only
マスター表"SCOTT"."SYS_IMPORT_FULL_01"は正常にロード/アンロードされました
                                     :
. . "SCOTT"."LOAD_TEST"              52.33 MB  100000行がインポートされました
ジョブ"SCOTT"."SYS_IMPORT_FULL_01"が金 6月 19 11:31:34 2015 elapsed 0 00:00:56で正常に完了しました

SQL> select ProductID, CountryCode, CustomerID from Load_test where rownum <= 10;
 PRODUCTID CO CUSTOMERID
---------- -- ----------
      1006 US      10002
      1003 US      10790
      1094 AR      10152
      1081 JA      10525
      1091 AR      10700
      1051 SA      10379
      1019 AR      10980
      1065 JA      10425
      1047 JA      10357
      1025 JA      10777

10行が選択されました。
--> Sort はされていない。
SQL> truncate table Load_test;

SQL> commit;

 

 

2.2.5 exp/imp

exp scott/tiger file=exp/sales.dmp log=exp/exp_sample.log tables=\(Load_Data\)
指定された表をエクスポートします... 従来型パス経由...
.. 表                      LOAD_DATAをエクスポート中     100000行エクスポートされました。
エクスポートは警告なしで正常終了しました。

SQL> rename load_data to load_data_wk;
SQL> rename load_test to load_data;

imp scott/tiger file=exp/sales.dmp log=exp/imp_sample.log ignore=y tables=\(Load_Data\) direct=y
LRM-00101: 不明なパラメータ名です。'direct'

imp scott/tiger file=exp/sales.dmp log=exp/imp_sample.log tables=\(Load_Data\) ignore=y
. SCOTTのオブジェクトをSCOTTにインポートしています
. SCOTTのオブジェクトをSCOTTにインポートしています
. . 表            "LOAD_DATA"をインポートしています     100000行インポートされました。
インポートは警告なしで正常終了しました。

SQL> select ProductID, CountryCode, CustomerID from Load_Data where rownum <= 10;
 PRODUCTID CO CUSTOMERID
---------- -- ----------
      1006 US      10002
      1003 US      10790
      1094 AR      10152
      1081 JA      10525
      1091 AR      10700
      1051 SA      10379
      1019 AR      10980
      1065 JA      10425
      1047 JA      10357
      1025 JA      10777

10行が選択されました。
--> Sort されていない。

SQL> truncate table load_test;

SQL> commit;


 

2.2.6 SQL*Loader (Express Mode)

-- SQL*Loader が処理できるCSV ファイルを作成
-- データの前後を'"' で囲んでカンマで区切る
-- 文字データ内の'"' は'""' に変更
$ cat data.sql
connect scott/tiger
alter session set nls_date_format = 'YYYYMMDD_HH24MISS';
set pages 0
set heading off
set feedback off
set lines 1000
set trimspool on
spool load_test.dat
select '"' || ProductID || '","' || CountryCode || '","' ||
  CustomerID || '","' || SalesDate || '","' || SalesCount || '","' ||
  SalesAmount || '","' ||
  replace(description, '"', '""') || '","' ||
  replace(UserComment, '"', '""') || '"'
  from load_data;
spool off
exit

$ sqlplus /nolog @data.sql

-- SQL*Loader からデータロード
$ sqlldr scott/tiger table=load_test optionally_enclosed_by='\"' date_format="YYYYMMDD_HH24MISS"
SQL> select ProductID, CountryCode, CustomerID from Load_Test where rownum <= 10;

 PRODUCTID CO CUSTOMERID
---------- -- ----------
      1001 AR      10004
      1001 AR      10008
      1001 AR      10008
      1001 AR      10008
      1001 AR      10016
      1001 AR      10032
      1001 AR      10040
      1001 AR      10040
      1001 AR      10044
      1001 AR      10044

10行が選択されました。

--> 明示的にDirect 処理を行っていないが、Sort されている。

-- SQL*Loader のログから、内部の処理を確認
$ cat load_test.log

SQL*Loader: Release 12.1.0.2.0 - Production on 金 6月 19 15:20:59 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

エクスプレス・モード・ロードの表: LOAD_TEST
データファイルload_test.dat
  不良ファイル:  load_test_%p.bad
  廃棄ファイル:  指定なし
           : 途中省略
可能性のある再使用のために生成された制御ファイル:
OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA
INFILE 'load_test'
APPEND
            : 途中調略
可能性のある再使用のために生成された制御ファイルの終わり。

一時ディレクトリ・オブジェクトSYS_SQLLDR_XT_TMPDIR_00000がパス/home/oracleに対して作成されました
→ 内部で、データファイルのある場所に対してディレクトリが作成されている。

パラレルDML: ALTER SESSION ENABLE PARALLEL DMLを有効化します
外部表"SYS_SQLLDR_X_EXT_LOAD_TEST"を作成しています
CREATE TABLE "SYS_SQLLDR_X_EXT_LOAD_TEST"
               : 途中省略
ORGANIZATION external
(
  TYPE oracle_loader
  DEFAULT DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
  ACCESS PARAMETERS
  (
               : 途中省略
  )
  location
  (
    'load_test.dat'
  )
)REJECT LIMIT UNLIMITED
→ 指定されたデータファイル参照するための外部表を定義している。
               : 途中省略
INSERT文を実行してデータベース表LOAD_TESTをロードしています
INSERT /*+ append parallel(auto) */ INTO LOAD_TEST
(
               : 途中省略
)
SELECT
               : 以下省略

--> 内部で外部表を使用してdirect insert を行っているため、属性Clusteringが有効化された。

-- SQL*Loader Express Mode は、外部表を経由してDirect Load してデータを投入している。
-- SQL*Loader 実行ユーザからディレクトリの作成権限 (DBA ロール) を外してみる。

$ sqlplus "/ as sysdba"
SQL> revoke dba from scott;
SQL> grant create session to scott;
SQL> grant create table to scott;
SQL> grant unlimited tablespace to scott;
SQL> connect scott/tiger
SQL> truncate table load_test;
SQL> commit;
SQL> exit

-- 先と同じように、SQL*Loader を実行してログを確認
エクスプレス・モード・ロードの表: LOAD_TEST
使用パス:      外部表, DEGREE_OF_PARALLELISM=AUTO
SQL*Loader-816: 一時ディレクトリ・オブジェクトSYS_SQLLDR_XT_TMPDIR_00000をファイルload_test.datに対して作成中にエラーが発生しました
ORA-01031: 権限が不足しています。
SQL*Loader-579: ロードのディレクト・パスに切替え中
SQL*Loader-583: ダイレクト・パスの切捨て設定を無視し、LDRTRIMの値を使用します
SQL*Loader-584: ダイレクト・パスのDEGREE_OF_PARALLELISM設定を無視し、NONEの値を使用します
エクスプレス・モード・ロードの表: LOAD_TEST
使用パス:      ダイレクト

ロードは完了しました。 - 論理レコード件数100000
--> direct load が使用されている。

SQL> select ProductID, CountryCode, CustomerID from Load_Test where rownum <= 10;

 PRODUCTID CO CUSTOMERID
---------- -- ----------
      1006 US      10002
      1003 US      10790
      1094 AR      10152
      1081 JA      10525
      1091 AR      10700
      1051 SA      10379
      1019 AR      10980
      1065 JA      10425
      1047 JA      10357
      1025 JA      10777

10行が選択されました。
--> Sort 処理は行われていない。
SQL*Loader のDirect Load の場合は、Sort されない。(ディレクトリ作成権限が無い場合)

SQL> truncate table load_test;

SQL> commit;

 

2.2.7 SQL*Loader (従来 Mode)

-- 権限を戻して従来Mode のSQL*Loader での挙動を確認
$ sqlplus "/ as sysdba"
SQL> grant dba to scott;
SQL> exit

$ cat load_test.ctl
LOAD DATA
INFILE 'load_test.dat'
BADFILE 'load_test.bad'
DISCARDFILE 'load_test.dsc'
TRUNCATE
INTO TABLE LOAD_TEST
fields terminated by ',' optionally enclosed by '"'
date format "YYYYMMDD_HH24MISS"
(PRODUCTID,
 COUNTRYCODE,
 CUSTOMERID,
 SALESDATE DATE,
 SALESCOUNT,
 SALESAMOUNT,
 DESCRIPTION CHAR(256),
 USERCOMMENT CHAR(256)
)

$ sqlldr scott/tiger bindsize=52428800 readsize=52428800 control=load_test.ctl rows=50000
使用パス:      従来型
コミット・ポイントに達しました。 - 論理レコード件数25401
コミット・ポイントに達しました。 - 論理レコード件数50802
コミット・ポイントに達しました。 - 論理レコード件数76203
コミット・ポイントに達しました。 - 論理レコード件数91474
コミット・ポイントに達しました。 - 論理レコード件数100000

表LOAD_TEST:
  100000行のロードに成功しました。
SQL> select ProductID, CountryCode, CustomerID from Load_Test where rownum <= 10;
 PRODUCTID CO CUSTOMERID
---------- -- ----------
      1055 US      10418
      1012 JA      10697
      1066 JA      10125
      1030 AR      10176
      1013 SA      10695
      1047 JA      10705
      1036 SA      10907
      1066 SA      10631
      1049 JA      10721
      1040 AR      10660

10行が選択されました。

--> Sort はされていない。

-- 従来Mode でDirect Load させた時の挙動も確認

$ sqlldr scott/tiger control=load_test.ctl direct=true
SQL*Loader: Release 12.1.0.2.0 - Production on 金 6月 19 16:12:00 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

使用パス:      ダイレクト

ロードは完了しました。 - 論理レコード件数100000

表LOAD_TEST:
  100000行のロードに成功しました。

確認するログ・ファイル:
  load_test.log
ロードの詳細を参照してください。

SQL> select ProductID, CountryCode, CustomerID from Load_Test where rownum <= 10;
 PRODUCTID CO CUSTOMERID
---------- -- ----------
      1006 US      10002
      1003 US      10790
      1094 AR      10152
      1081 JA      10525
      1091 AR      10700
      1051 SA      10379
      1019 AR      10980
      1065 JA      10425
      1047 JA      10357
      1025 JA      10777

10行が選択されました。

--> Sort はされていない。

SQL*Loader のDirect Load は、/*+ APPEND */ を使用したInsert を行っている訳ではないので、基本的に属性Clustering は動作しません。
但しExpress Mode を使用した場合、ディレクトリの作成権限があるユーザを使用すると、内部でLoad させるデータを外部表にマッピングして
Insert /*+ APPEND */ 処理を行うので、属性Clustering が動作します。

属性Clustering とSQL*Loader を併用している環境では、意図しない箇所で大規模なSort 処理が発生する可能性があるので注意が必要です。

 

2.3ヒントによる属性Clustering の制御

前節までで属性Clustering の基本的な内部動作を確認しました。
データベースを運用していくと、定義内容を変更せずに一時的に制御のOn/Off を変更したい場合があります。属性Clustering ではそのような要件を満たすため、ヒントを指定する事によって動作をOn/Off を上書きできるようになっています。
属性Clustering に関連するヒントは、以下の2つが用意されています。
/*+ CLUSTERING */         :属性Clustering を定義した表のNO ON LOAD
                               設定を上書きします。
                               属性Clustering が定義されていないテーブルに
                               対しての指定は無効です。
/*+ NO_CLUSTERING */     :Direct Load で属性Clustering を無効化します。

それではこれらのヒントについて、属性Clustering の動作を確認してみましょう。

-- CLUSTERING ヒントの確認
--属性Clustering の設定がNO ON LOAD, NO ON DATA MOVEMENT のテーブルを作成
SQL> drop table Sales6 purge;
SQL> Create table Sales6 (
  ProductID     number(8)    NOT NULL,
       CountryCode   varchar2(2)  NOT NULL,
       CustomerID    number(8)    NOT NULL,
  SalesDate     date         NOT NULL,
       SalesCount    number(8),
       SalesAmount   number(8),
       Description   varchar2(256),
       UserComment   varchar2(256),
       constraints pk_sales6 Primary Key (ProductID, CustomerID, SalesDate)
) Clustering By Linear order (ProductID, CountryCode, CustomerID)
NO ON LOAD NO ON DATA MOVEMENT;

SQL> commit;
SQL> select * from dba_clustering_tables where table_name = 'SALES6';
OWNER  TABLE_ CLUSTERING_T ON_LO ON_ VALID WITH_ LAST_LOAD_CLST  LAST_DATAMOVE_CLST
------ ------ ------------ ----- --- ----- ----- --------------- -------------------------
SCOTT  SALES6 LINEAR       NO    NO  YES   NO

→ ON LOAD, ON DATA MOVEMENT 共にNO となっています。

-- SALES6 に対して通常通りDirect Insert
SQL> insert /*+ APPEND */ into sales6 select * from sales;
SQL> commit;
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales6 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000
--> NO ON LOAD で属性Clustering を指定したためDirect Load を行ってもSort されません。

SQL> truncate table sales6;
SQL> insert /*+ APPEND CLUSTERING */ into sales6 select * from sales;
SQL> commit;
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales6 where rownum <= 10;
 PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1001 AR      10004 15-05-09          2         200
      1001 AR      10004 15-05-09          3         300
      1001 AR      10004 15-05-09          5         500
      1001 AR      10004 15-05-10          2         200
      1001 AR      10004 15-04-27          7         700
      1001 AR      10004 15-04-26          7         700
      1001 AR      10004 15-05-03          6         600
      1001 AR      10004 15-04-25          2         200
      1001 AR      10004 15-04-28         10        1000
      1001 AR      10004 15-04-20          8         800
--> CLUSTERING ヒントによってNO ON LOAD 属性が上書きされてSort 処理が行われました。

select * from dba_clustering_tables where table_name = 'SALES6';
OWNER  TABLE_ CLUSTERING_T ON_LO ON_ VALID WITH_ LAST_LOAD_CLST            LAST_DATAMOVE_CLST
------ ------ ------------ ----- --- ----- ----- ------------------------- -------------------------
SCOTT  SALES6 LINEAR       NO    NO  YES   NO    16-04-13 16:07:54.780698

--> DATA LOAD による属性Clustering の最終実行時刻も更新されています。

-- 前節で属性Clustering が動作しなかったMerge文とMultitable Insert について
-- CLUSTERING ヒント を指定した場合の動作を確認します。

SQL> truncate table sales4;
SQL> commit;
SQL> merge /*+ APPEND_VALUES CLUSTERING */ into sales4 t1
       using (select * from sales3) t2
        on (t1.ProductID = t2.ProductID and t1.CountryCode = t2.CountryCode and
t1.CustomerID = t2.CustomerID)
        when matched then
          update set t1.SalesDate = t2.SalesDate, t1.SalesCount = t2.SalesCount,
            t1.SalesAmount = t2.SalesAmount, t1.Description = t2.Description,
            t1.UserComment = t2.UserComment
        when not matched then
          insert (ProductID, CountryCode, CustomerID, SalesDate,
SalesCount, SalesAmount, Description, UserComment)
            values (t2.ProductID, t2.CountryCode, t2.CustomerID, t2.SalesDate,
                    t2.SalesCount, t2.SalesAmount, t2.Description, t2.UserComment);

SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales4 where rownum <= 10;
行2でエラーが発生しました。:
ORA-12838: オブジェクトは、パラレルで変更された後は読取り/変更できません。

SQL> commit;
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales4 where rownum <= 10;

PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000

--> CLUSTERING ヒントを指定しても、Merge 文はSort されませんでした。

SQL> drop table sales4 purge;
SQL> Create table Sales4 (
  ProductID     number(8)    NOT NULL,
       CountryCode   varchar2(2)  NOT NULL,
       CustomerID    number(8)    NOT NULL,
       SalesDate     date         NOT NULL,
  SalesCount    number(8),
       SalesAmount   number(8),
  Description   varchar2(256),
       UserComment   varchar2(256),
       Primary Key (ProductID, CustomerID, SalesDate)
) Clustering By Linear order (ProductID, CountryCode, CustomerID);
SQL> truncate table sales5;
SQL> commit;
SQL> Insert /*+ APPEND CLUSTERING */ all
      into sales4
      into sales5
      select * from sales;
SQL> commit;
SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales4 where rownum <= 10;
PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000

SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales5 where rownum <= 10;
PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000

--> Multitable Insert もCLUSTERING ヒントをしてもSort 処理は行われませんでした。

-- NO_CLUSTERING ヒントの確認

SQL> truncate table sales4;
SQL> insert /*+ APPEND */ into sales4 select * from sales;
SQL> commit;

SQL> select productid, countrycode, customerid, salesdate, salescount, salesamount
       from sales4 where rownum <= 10;
PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1001 AR      10004 15-05-09          2         200
      1001 AR      10004 15-05-09          3         300
      1001 AR      10004 15-05-09          5         500
      1001 AR      10004 15-05-10          2         200
      1001 AR      10004 15-04-27          7         700
      1001 AR      10004 15-04-26          7         700
      1001 AR      10004 15-05-03          6         600
      1001 AR      10004 15-04-25          2         200
      1001 AR      10004 15-04-28         10        1000
      1001 AR      10004 15-04-20          8         800
--> NO_CLUSTERING ヒントを指定しなければSort されている事を確認

SQL> truncate table sales4;
SQL> insert /*+ APPEND NO_CLUSTERING */ into sales4 select * from sales;
SQL> commit;
PRODUCTID CO CUSTOMERID SALESDAT SALESCOUNT SALESAMOUNT
---------- -- ---------- -------- ---------- -----------
      1006 US      10002 15-05-11          5        3000
      1003 US      10790 15-05-11          6        1800
      1094 AR      10152 15-05-11          4       37600
      1081 JA      10525 15-05-11         10       81000
      1091 AR      10700 15-05-11          1        9100
      1051 SA      10379 15-05-11         10       51000
      1019 AR      10980 15-05-11          1        1900
      1065 JA      10425 15-05-11          6       39000
      1047 JA      10357 15-05-11          1        4700
      1025 JA      10777 15-05-11         10       25000

--> NO_CLUSTERING ヒントを指定すれば、Sort 処理が行われない事を確認

 

3. まとめ

以上で 属性 Clustering の検証は一通り終了です。先にも触れたとおり、属性 ClusteringはDirect 処理を行う際にデータをSort して格納するだけの、極めてシンプルな機能です。属性Clustering を使用するための初期化パラメータや、定義されたテーブルに対して適用される新しい実行計画もありません。しかし、物理的にデータをSort して格納する事から、圧縮機能と組み合わせる事によりストレージやメモリの利用効率が大幅に向上します。

参考情報

Oracle 12.1.0.2 Core Tech セミナー
http://www.oracle.com/technetwork/jp/ondemand/od12c-coretech-aug2014-2283256-ja.html


Oracle 12.1.0.2 新機能概要
https://blogs.oracle.com/otnjp/entry/database_12c_new_feature


属性クラスタリング (Oracle 12c データ・ウエアハウス・ガイド)
http://docs.oracle.com/cd/E57425_01/121/DWHSG/attcluster.htm#CCHEEJFD


Oracle 12.1.0.2 管理者ガイド
https://docs.oracle.com/cd/E57425_01/121/ADMIN/tables.htm#sthref2222


Oracle 12.1.0.2 Database SQL 言語リファレンス
http://docs.oracle.com/cd/E57425_01/121/SQLRF/toc.htm


Oracle 12.1.0.2 Database リファレンス
http://docs.oracle.com/cd/E57425_01/121/REFRN/toc.htm



前の記事
吉田宗弘

Oracle歴20年。Orace7.2からExadataまで経験していて、マニュアルをほぼ暗記するほどどっぷり浸かっています。 気分転換にGoldenGate、Coherence、その他NoSQLデータベースなどのプロダクトをやることもあります。
Oracle以外だと古代史オタクといっていいくらい本を大量に読んでいて、京都のお寺巡りなどやっています。



金永昊
韓国出身エンジニア。韓国留学中だった日本人の奥さんと結婚して2007年に来日。WEB・オープン系開発者を経てアクアシステムズでデータベース・エンジニアとして、DBA関連の仕事を担当。
最近は、日本でもリリースされたTibero RDBMSとOracle社の最先端技術であるOracle Exadataの仕事ができてウキウキしている。


関口隆二
インフラ、ネットワークエンジニアとして、機器のラッキング、L7SW構築からDB構築までを担当。
OSI参照モデルのL1からL7までカバーすべく、広く浅くをモットーに業務を遂行してます。
趣味は登山と散歩。歩くことが大好きで常に重い荷物を持ってます。家族と山とアンパン(ツブアンのみ)をこよなく愛する30代です。

アクアシステムズの製品・サービスに関するお問合せはこちら

アクアシステムズは、データベーススペシャリストの立場から、データベースの堅牢性とパフォーマンスの向上を追求しています。