質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Q&A

解決済

1回答

1834閲覧

表定義の列順序&複合主キーの列順序と、INSERT&SELECT速度の関係

castanopsia

総合スコア12

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

0グッド

0クリップ

投稿2019/05/20 05:12

編集2019/05/20 05:16

Oracle Databaseを使用したクライアントサーバシステムの改修を行っています。

前提・実現したいこと

現行システムに以下のような定義の「商品マスタ」テーブルがあります。

DDL

1CREATE TABLE "商品マスタ" ( 2 "商品ID" NUMBER(8,0) NOT NULL ENABLE, 3 "商品名" VARCHAR2(100 BYTE), 4 ..., 5 CONSTRAINT "商品マスタ_PK" PRIMARY KEY ("商品ID") 6 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 7 STORAGE( 8 INITIAL 458752 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 9 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 10 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT 11 ) 12 TABLESPACE "表領域A" ENABLE 13) SEGMENT CREATION IMMEDIATE 14PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 15OCOMPRESS LOGGING 16STORAGE( 17 INITIAL 6291456 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 18 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 19 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT 20) 21TABLESPACE "表領域A"

今回、新たに「商品マスタ更新履歴」テーブルを作成し、「商品マスタ」テーブルのUPDATE時にトリガを起動してUPDATE対象の行の更新前データを「商品マスタ更新履歴」テーブルに残していくことになりました。

DDL

1CREATE TABLE "商品マスタ更新履歴" ( 2 "商品ID" NUMBER(8,0) NOT NULL ENABLE, 3 "更新日時" DATE NOT NULL ENABLE, 4 "更新者ID" CHAR(8 BYTE) NOT NULL ENABLE, 5 "商品名" VARCHAR2(100 BYTE), 6 ..., 7 CONSTRAINT "商品マスタ更新履歴_PK" PRIMARY KEY ("商品ID", "更新日時", "更新者ID") 8 ...

質問したいこと

  1. この「商品マスタ更新履歴」テーブルについて、表定義の列順序および複合主キーの列順序によってINSERTの速度は変化するでしょうか? 以下のA案/B案どちらのほうが高速ですか?

 
2. この「商品マスタ更新履歴」に対して主キー項目すべてをWHERE条件に含めて1行のみSELECTしてくる場合、表定義の列順序および複合主キーの列順序によってSELECTの速度は変化するでしょうか? 以下のA案/B案どちらのほうが高速ですか?

(なお、プロジェクトの規約により複合主キーの列順序は表定義の列順序と同じでなければなりません。)
また、情報元ソースのURLもいただけると大変うれしいです。

列順序案A: "商品ID", "更新日時", "更新者ID"

 

列順序案B: "更新日時", "更新者ID", "商品ID"

補足情報

データベースのバージョン:Oracle Database 12c

 

データベースについてはズブの素人なので、記載すべき前提条件などが漏れていればお手数ですがご指摘いただけると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のA案/B案どちらのほうが高速ですか?

INSERTもSELECTもほとんど変わらないでしょう。
sqlplusで
SET TIMING ON
としてから
PL/SQLなどLOOPが使える言語で100万行くらい INSERT or SELECT して時間を実測しては?

(なお、プロジェクトの規約により複合主キーの列順序は表定義の列順序と同じでなければなりません。)

WHERE句での記述が「表定義の列順序と同じ」であると良いのですが、あまり現地的なルールには思えません。INDEX SKIP SCAN が使えるかもしれませんが、効率の良い実行計画であることは確認してください。

実行計画??統計情報??って人へ

投稿2019/05/20 06:31

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

castanopsia

2019/05/21 00:25

回答ありがとうございました。 解決できそうです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問