Oracle Direct Seminar <Insert Picture Here> 効果的な集計処理ことはじめ 日本オラクル株式会社

Similar documents
30 分で理解する ORACLE MASTER ORACLE MASTER 概要 取得メリット 最新動向 勉強方法について Copyright 2011, Oracle. All rights reserved. 2

はじめに コースの概要と目的条件分岐の方法や複雑な集計の手法など SQL のコーディングの幅を広げるためのテクニックについて説明します また パフォーマンスを考慮した記述方法や正しい結果を取得するための記述方法などについても あわせて説明します 本コースでは 実践的な SQL の記述手法を広く浅く紹

第 2 章 問合せの基本操作 この章では データベースから情報を検索する際に使用する SELECT コマンド および SELECT コマンドと 同時に使用する句について説明します 1. 問合せとは 2. 基本的な問合せ 3. 列の別名 4. 重複行を一意にする 5. 検索行の絞込み 6. 文字パター

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

Oracle Direct Seminar <Insert Picture Here> 体感型セミナー SQL をクイズ感覚で学ぶ! SQL クイズ 日本オラクル株式会社

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

目次 1 集計関数 / 分析関数とは 2 集計関数 / 分析関数のパフォーマンス効果 3 ケーススタディグループ小計やクロス集計を計算するランキングを表示する前月比較を表示する累計を計算する移動平均を計算する構成比を計算する Oracle8i SQL Oracle8i Oracle Oracle C

Slide 1

アジェンダ ORACLE MASTER Oracle Database 11g 概要 11g SQL 基礎 Ⅰ 試験紹介 ポイント解説 Copyright 2011 Oracle. All rights reserved. 2

Oracle Direct Seminar <Insert Picture Here> 試験対策ポイント解説 11g SQL 基礎 Ⅰ 日本オラクル株式会社

第 5 章 結合 結合のパフォーマンスに影響を与える結合の種類と 表の結合順序について内部動作を交えて 説明します 1. 結合処理のチューニング概要 2. 結合の種類 3. 結合順序 4. 結合処理のチューニングポイント 5. 結合関連のヒント

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

アジェンダ Oracle GoldenGate 概要 Oracle GoldenGate 活用ポイント Trigger Delete Cascade 設定テーブルの競合 ASM インスタンスへの接続 Bounded Recovery まとめ 2

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

ファイル、メールからの情報漏えいを防ぐための Oracle Information Rights Management 11g

Microsoft PowerPoint - 講義補助資料2017.pptx

プレポスト【問題】

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

アジェンダ データベース 表 の 準 備 表 の 設 計 表 の 作 成 データのローディング Demonstration:やってみよう!データベース 表 の 作 成 アプリケーションの 作 成 アプリケーションの 作 成 レポートの 作 成 グラフの 作 成 Demonstration:やってみよ

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

クラウド時代のインフラ構成/変更管理とコンプライアンス管理

Microsoft PowerPoint _SQLDeveloper.ppt [互換モード]

untitled

untitled

BC4J...4 BC4J Association JSP BC4J JSP OC4J

Oracle活用実践演習コース

はじめに コースの概要と目的 Oracle をより効率的に使用するための SQL のチューニング方法について説明します また 索引の有無 SQL の 記述方法がパフォーマンスにどのように影響するのかを実習を通して理解します 受講対象者 アプリケーション開発者 / データベース管理者の方 前提条件 S

Microsoft PowerPoint - KeySQL50_10g_vlo2.ppt

Slide 1

Agenda Windows ServerとOracle Databaseについて 最低限知っておいてほしい セキュリティ面でのポイント Windowsユーザー向け.NET 開発者向け Copyright 2011, Oracle. All rights reserved. 2

富士通Interstage Application Server V10でのOracle Business Intelligence の動作検証

この操作手順書は SupportDeskサービスを契約していただいた方のみにご利用いただける会員限定 Webサイト SupportDesk-Web( の体験版である SupportDesk-Webを体験しよう の使い方

Title Slide with Picture

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Title Slide with Picture

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

PowerPoint Presentation

Oracle SQL Developerの移行機能を使用したOracle Databaseへの移行

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

新オーダープロセスのご利用ガイド

PA4

意外と簡単!? Oracle Database 11g -バックアップ・リカバリ編-

Windowsユーザーの為のOracle Database セキュリティ入門

スライド 1

Agenda Overview 災害対策方法検討 実現可能となるソリューション リアルタイム性 運用管理面に優れたOracle Data Guard 柔軟な構成を可能にするOracle GoldenGate Oracle 標準機能で利用可能な基本スタンバイ データベース 2

標準化 補足資料

Oracle Direct Seminar <Insert Picture Here> システム管理者必見! ~ 乱立する DB と OS のユーザー / 権限管理の改善方法 日本オラクル株式会社 Fusion Middleware 事業統括本部 Security SC 部大森潤

Oracle Direct Seminar 実演! 社内システムにおけるデータ連携方法ご紹介 日本オラクル株式会社 2011 年 4 月 6 日

Slide 1

PowerPoint プレゼンテーション

untitled

Slide 1

アジェンダ ORACLE MASTER Oracle Database 11g 概要 Gold DBA11g 試験紹介 ポイント解説 無償技術サービス Oracle Direct Concierge SQL Server からの移行アセスメント MySQL からの移行相談 PostgreSQL から

今さら聞けない!? Oracle入門 ~前編~

基本サンプル

Oracle Universal Content Management ドキュメント管理 クイック・スタート・チュ-トリアル

アジェンダ Oracle Databaseのデータ ローディング SQL*Loaderを使用したデータ ローディング 外部表を使用したデータ ローディング SQL*Loaderと外部表の比較 まとめ 2

目次 はじめに... 2 無料トライアルのサインアップ方法... 3 トライアル環境へのアクセス 参考情報

基本サンプル


今さら聞けない!? Oracle入門 ~後編~

HULFT 技術サポートサイト お問い合わせ入力操作説明

COBOL Enterprise Edition V2 for Linux COBOL Enterprise Edition V2 は以下のソフトウェアによって構成されています COBOL Enterprise Edition Developer V2.0 COBOL Enterprise Edit

基本サンプル

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

Oracle on Windows

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

APEX Spreadsheet ATP HOL JA - Read-Only

Microsoft PowerPoint - db03-5.ppt

PowerPoint プレゼンテーション

EM10gR3記者発表

Microsoft PowerPoint - FormsUpgrade_Tune.ppt

untitled

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

DB12.1 Beta HandsOn Seminar

Oracle Direct Seminar <Insert Picture Here> Oracle TimesTen In-Memory Database インメモリ DB による高速化がシステム設計を変える 日本オラクル株式会社

【EW】かんたんスタートマニュアル

COBOL EE開発環境 ご紹介資料

1. はじめに (1) 本書の位置づけ 本書ではベジフルネット Ver4 の導入に関連した次の事項について記載する ベジフルネット Ver4 で改善された機能について 新機能の操作に関する概要説明 ベジフルネット Ver4 プログラムのインストールについて Ver4 のインストール手順についての説明

セットアップカード

Microsoft PowerPoint _Spotfire Installation from Scistore.pptx

Microsoft認定資格問題集DEMO(70-459_Part2)

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

橡実践Oracle Objects for OLE

MailArchiva MailArchiva パブリックイメージ for NIFTYCloud 初期設定マニュアル メールアーカイブのための基本設定マニュアル 第 1.0 版 2011 年 8 月 22 日有限会社ディアイピィ

以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらな

CLUSTERPROXSingleServerSafe SingleServerSafe ご紹介 2007 年 10 月

KDDI Smart Mobile Safety Manager Apple Business Manager(ABM) 運用マニュアル 最終更新日 2019 年 4 月 25 日 Document ver1.1 (Web サイト ver.9.6.0)

Sequel のすすめ 私が SQL を嫌いな理由 とみたまさひろ RubyHiroba Sequel のすすめ - 私が SQL を嫌いな理由 Powered by Rabbit 2.0.7

3/7 マイグレーション開発方針 顧客名 0 作成者 根岸正 < プログラム移行方針 > システム名称 A-VX システムマイグレーション作成日 2015/09/01 < COBOL 資産のプログラム移行 > COBOLソース ( メインとCOPYLIB) を入力としてSCC 言語変換ツールにてVB

Oracle Data Pumpのパラレル機能

CLUSTERPRO X 4.0 新機能

MySQL研修コース & 資格のご案内

Oracle SQL Developer Data Modeler

PowerPoint プレゼンテーション

Agenda パラレル実行の概要と効果 11g R1までのパラレル実行にまつわる懸念点 簡単設定で解決!! Oracle Database 11g R2のパラレル化 まとめ 2

Slide 1

Enterprise Cloud + 紹介資料

Transcription:

Oracle Direct Seminar <Insert Picture Here> 効果的な集計処理ことはじめ 日本オラクル株式会社

アジェンダ 集計処理今昔 Oracle Databaseの集計処理 効果的な集計処理 まとめ 2

集計処理今昔 RDBMS を利用しない集計処理初期の RDBMS を利用した集計処理 (Pro*C Pro*COBOL アプリ ) サーバ上で動作可能な実行モジュールを作成 COBOLやC 言語などのコンパイラ言語で記述されることが多い サーバ側で提供されるライブラリやAPIを利用してアプリケーションを作成 集計処理のロジックをコンパイラ言語で記述 データを1 件づつ読み込んで処理をおこなうことが多い ( 直列処理 ) SQL で データの集合 を扱っていない アプリケーション ( プロセス ) アプリケーション ( プロセス ) SELECT データ入力 COBOL SAM / ISAM 等 データ入力 SQL サーバ プロセス ライブラリ ( ソート等 ) COBOL ライブラリ ( 変換等 ) COBOL 集計処理 COBOL 処理結果データ出力 (API) COBOL SAM / ISAM 等 ライブラリ ( ソート等 ) COBOL ライブラリ ( 変換等 ) COBOL 集計処理 COBOL 処理結果データ出力 SQL 参照 更新 INSERT UPDATE DELETE データベース 帳票 データ出力 (API) COBOL 帳票 3

集計処理今昔 SQL を活用した集計処理 : SQL で データの集合 を扱う SQL を実行可能なインターフェースがあれば特に実行モジュールの形式は問わない 集計ロジックを SQL に移管することによる アプリケーションのメンテナンス性向上 H/W RDBMS 側の進化 ( パラレル処理等による性能向上 ) の恩恵を最大限享受 集計処理結果を様々な方法で容易に利用可能 (Business Intelligence など ) アプリケーション ( プロセス ) 集計処理 処理結果 データ出力 (API) SQL Java SELECT サーバ プロセスサーバ プロセスサーバ プロセス参照データ入力ソート (ORDER BY) 変換 ( ファンクション ) 集計 (GROUP BY) データベース アプリケーション ( プロセス ) 集計処理 SELECT + INSERT UPDATE DELETE SQL サーバ プロセスサーバ プロセスサーバ プロセス参照 / 更新データ入力ソート (ORDER BY) 変換 ( ファンクション ) 集計 (GROUP BY) 処理結果データ更新 データベース BI 帳票 4

集計処理今昔差異のまとめ アプリケーション開発言語 これまでの集計処理 コンパイラ言語 (C COBOL) プリコンパイラ製品 (Pro*C Pro*COBOL) 集計ロジックコンパイラ言語で記述されることが多い SQL で表現 SQL 実行回数集計処理中のループ処理内にて何度も実行 1~ 数回 処理の実行形態 RDBMS の進化への適合 H/W 進化への適合 単体での実行処理範囲を分割することによる並列処理も可能だが 分割単位を細かく設定する必要あり RDBMS の基本機能を利用単純な SQL の繰り返し処理が多く 基本的には索引処理の繰り返し プロセッサ速度の向上による処理時間短縮 SQL を活用した集計処理 SQL を実行できる言語またはインターフェース (SQL*Plus 等 ) Oracle Database のパラレル機能による並列処理が可能 SQL のオプティマイザ性能向上 パラレル機能による並列処理 Exadata を利用することによる劇的な速度向上が見込める プロセッサ速度の向上 およびマルチ CPU マルチ Core 化に対する並列処理による処理時間短縮 利用形態 帳票を介した利用形態が多い 帳票のみならず Business Intelligence 機能等で の活用が容易 5

アジェンダ 集計処理今昔 Oracle Databaseの集計処理 SQL 内部にロジック (IF.. THEN.. ELSE) を組み込む GROUP BY 拡張 ピボット操作 分析関数 MODEL 句 効果的な集計処理 まとめ 6

Oracle Database の集計処理主要な機能 GROUP BY 句 GROUP BY 拡張 : SQL99 ROLLUP, CUBE GROUPING SETS ピボット操作 分析関数 ( ウィンドウ ファンクション ): SQL2003 集計ウィンドウ ファンクション FIRST/LAST 関数 ヒストグラム関数 等 MODEL 句 Oracle 11g ~ Oracle 10g ~ Oracle 8i ~ Oracle 9i ~ Oracle 8i ~ Oracle 9i ~ 7

Oracle Database の集計処理 SQL 内部にロジック (IF.. THEN.. ELSE) を組み込む ( その 1) CASE 式 (Oracle 8i ~ 1) SELECT cust_last_name, CASE credit_limit WHEN 100 THEN 'Low' WHEN 5000 THEN 'High' ELSE 'Medium' END AS credit FROM customers ORDER BY cust_last_name, credit; DECODE ファンクション 単純 CASE 式 SELECT product_id, DECODE(warehouse_id, 1, 'Southlake', 2, 'San Francisco', SELECT AVG( CASE WHEN e.salary > 2000 THEN e.salary ELSE 2000 END ) "Average Salary" FROM employees e; 3, 'New Jersey', 4, 'Seattle', 'Non domestic') "Location" FROM inventories ORDER BY product_id, "Location"; 検索 CASE 式 1 PL/SQL 構文として CASE を利用できるようになるのは Oracle 9i 以降 8

Oracle Database の集計処理 SQL 内部にロジック (IF.. THEN.. ELSE) を組み込む ( その 2) 集計関数と DECODE を利用した例 : SELECT TO_CHAR(" データ作成日 ",'YYYYMM') " 年月 ", " 取引区分 ", COUNT(*) " 件数 ", SUM(DECODE(" 予算措置区分 ",'1'," 処分損益額 ", '2'," 処分損益額 " * -1, " 処分損益額 ")) " 金額 " FROM " 支払い D" WHERE TO_CHAR(" データ作成日 ",'YYYYMMDD') <= '20110531' AND " みなし区分 "!= '9' GROUP BY TO_CHAR(" データ作成日 ",'YYYYMM')," 取引区分 " HAVING SUM(DECODE(" 予算措置区分 ",'1'," 処分損益額 ",'2'," 処分損益額 "*-1," 処分損益額 "))!= 0 特定の区分に従い 集計する数字 ( 金額等 ) を加工することで 単一の SQL で求めるべき数字を取得する 9

Oracle Database の集計処理これまでのサブ トータル ( 小計 ) の取得 カテゴリ単位で集計したい 単一の SQL で記述できるが 複数の SQL を UNION する必要あり SELECT job, deptno, SUM(sal) FROM emp GROUP BY job,deptno UNION ALL SELECT job, NULL deptno, SUM(sal) FROM emp GROUP BY job UNION ALL SELECT NULL job, deptno, SUM(sal) FROM emp GROUP BY deptno UNION ALL SELECT NULL job, NULL deptno, SUM(sal) FROM emp ORDER BY job,deptno これまで通り 通常の GROUP BY の結果を元にサブ トータルを算出する? 何度も UNION するのは非効率的! 1 JOB DEPTNO SUM(SAL) --------- ---------- ---------- ANALYST 20 6000 ANALYST 6000 CLERK 10 1300 CLERK 20 1900 CLERK 30 950 CLERK 4150 MANAGER 10 2450 MANAGER 20 2975 MANAGER 30 2850 MANAGER 8275 PRESIDENT 10 5000 PRESIDENT 5000 SALESMAN 30 5600 SALESMAN 5600 10 8750 20 10875 30 9400 全体の合計 29025 JOB 単位の小計 DEPTNO 単位の 合計 1 結果 10

Oracle Database の集計処理 GROUP BY 拡張 (ROLLUP その 1) GROUP BYの結果に加えて 指定した集計軸の並びに沿ったサブ トータルおよび総合計を得る JOB 構文 GROUP BY ROLLUP(expr1, expr2, expr3) 集計の単位 : (expr1, expr2, expr3) (expr1, expr2) (expr1) 全体 SELECT job, deptno, SUM(sal) FROM emp GROUP BY ROLLUP(job,deptno) ORDER BY job,deptno 1: GROUP BY 句で処理できる列は 拡張機能使用の有無にかかわらず 255 列以内です 1 1 DEPTNO SUM(SAL) --------- ------- -------- ANALYST 20 6000 ANALYST 6000 CLERK 10 1300 CLERK 20 1900 CLERK 30 950 CLERK 4150 MANAGER 10 2450 MANAGER 20 2975 MANAGER 30 2850 MANAGER 8275 PRESIDENT 10 5000 PRESIDENT 5000 SALESMAN 30 5600 SALESMAN 5600 1 結果 29025 11

Oracle Database の集計処理 GROUP BY 拡張 (ROLLUP その 2) 部分的 ROLLUP 総合計は不要 サブ トータル ( 小計 ) を得る 構文 GROUP BY expr1, ROLLUP(expr2, expr3) 集計の単位 : (expr1, expr2, expr3) (expr1, expr2) (expr1) SELECT job, deptno, SUM(sal) FROM emp GROUP BY job, ROLLUP(deptno) ORDER BY job,deptno 1: GROUP BY 句で処理できる列は 拡張機能使用の有無にかかわらず 255 列以内です 1 1 JOB DEPTNO SUM(SAL) --------- ------- -------- ANALYST 20 6000 ANALYST 6000 CLERK 10 1300 CLERK 20 1900 CLERK 30 950 CLERK 4150 MANAGER 10 2450 MANAGER 20 2975 MANAGER 30 2850 MANAGER 8275 PRESIDENT 10 5000 PRESIDENT 5000 SALESMAN 30 5600 SALESMAN 5600 1 結果 12

Oracle Database の集計処理 GROUP BY 拡張 (CUBE その 1) GROUP BY の結果に加えて 多次元クロス タブの結果を得る 構文 GROUP BY CUBE(expr1, expr2, expr3) 集計の単位 : (expr1, expr2, expr3) (expr1, expr2), (expr1,expr3), (expr2,expr3) (expr1), (expr2), (expr3) 全体 SELECT job, deptno, SUM(sal) FROM emp GROUP BY CUBE(job,deptno) ORDER BY job,deptno 1: GROUP BY 句で処理できる列は 拡張機能使用の有無にかかわらず 255 列以内です 1 1 JOB DEPTNO SUM(SAL) --------- ------- -------- ANALYST 20 6000 ANALYST 6000 CLERK 10 1300 CLERK 20 1900 CLERK 30 950 CLERK 4150 MANAGER 10 2450 MANAGER 20 2975 MANAGER 30 2850 MANAGER 8275 PRESIDENT 10 5000 PRESIDENT 5000 SALESMAN 30 5600 SALESMAN 5600 10 8750 20 10875 1 結果 30 9400 29025 13

Oracle Database の集計処理 GROUP BY 拡張 (CUBE その 2) 部分的 CUBE 総合計は不要 クロス タブの結果を得る 構文 GROUP BY expr1, CUBE(expr2, expr3) 集計の単位 : expr1 と CUBE 内に指定したカラムの組合せ (expr1, expr2, expr3) (expr1, expr2), (expr1,expr3) (expr1) SELECT job, deptno, SUM(sal) FROM emp GROUP BY job, CUBE(deptno) ORDER BY job,deptno 1: GROUP BY 句で処理できる列は 拡張機能使用の有無にかかわらず 255 列以内です 1 1 JOB DEPTNO SUM(SAL) --------- ------- -------- ANALYST 20 6000 ANALYST 6000 CLERK 10 1300 CLERK 20 1900 CLERK 30 950 CLERK 4150 MANAGER 10 2450 MANAGER 20 2975 MANAGER 30 2850 MANAGER 8275 PRESIDENT 10 5000 PRESIDENT 5000 SALESMAN 30 5600 SALESMAN 5600 1 結果 14

Oracle Database の集計処理 GROUP BY 拡張 (GROUPING SETS) ROLLUP や CUBE は独自の意味を持っていますが GROUPING SETS は任意の集約単位による集約が可能 構文 GROUP BY GROUPING SETS( ) () は総合計を意味する GROUP BY ROLLUP(a,b,c) = GROUP BY GROUPING SETS ((a,b,c), (a,b), ()) GROUP BY CUBE(a,b,c) = GROUP BY GROUPING SETS ((a,b,c), (a,b), (a,c),(b,c) (a), (b), (c), ()) 詳細はマニュアル Oracle Database データ ウェアハウス ガイド 11g リリース 2(11.2) を参照してください http://download.oracle.com/docs/cd/e16338_01/server.112/b56309/aggreg.htm#i1007462 15

Oracle Database の集計処理ピボット操作 (PIVOT) クロス タブ レポートを作成 JOB 毎の部門への配属人数内訳 SELECT job, これまでのピボット操作 SUM(CASE deptno WHEN 10 THEN 1 ELSE 0 END)) AS d10, SUM(CASE deptno WHEN 20 THEN 1 ELSE 0 END)) AS d20, SUM(CASE deptno WHEN 10 THEN 1 ELSE 0 END)) AS d30 FROM emp GROUP BY job ORDER BY job 集計関数 SELECT job, d10, d20, d30 FROM (SELECT job, deptno, empno FROM emp) PIVOT ( COUNT(empno) FOR deptno IN (10 AS d10, 20 AS d20, 30 AS d30) ) ORDER BY job; PIVOTを使った操作 ピボット操作の結果 JOB D10 D20 D30 --------- ----- ----- ----- ANALYST 0 2 0 CLERK 1 2 1 MANAGER 1 1 1 PRESIDENT 1 0 0 SALESMAN 0 0 4 16

Oracle Database の集計処理ピボット操作 (UNPIVOT) UNPIVOTを使うことでデータを列から行へ回転させることができます SELECT job, d10, d20, d30 FROM (SELECT job, deptno, empno FROM emp) PIVOT ( COUNT(empno) FOR deptno IN (10 AS d10, 20 AS d20, 30 AS d30) )ORDER BY job; PIVOT を使った操作 UNPIVOT を使った操作 SELECT job, deptno, cnt FROM ( SELECT job, d10, d20, d30 FROM (SELECT job, deptno, empno FROM emp) PIVOT ( COUNT(empno) FOR deptno 同じSELECT 文 IN (10 AS d10, 20 AS d20, 30 AS d30) ) ) UNPIVOT INCLUDE NULLS ( cnt FOR deptno IN (d10, d20, d30) )ORDER BY job, deptno JOB D10 D20 D30 --------- ----- ----- ----- ANALYST 0 2 0 CLERK 1 2 1 MANAGER 1 1 1 PRESIDENT 1 0 0 SALESMAN 0 0 4 JOB DEP CNT --------- --- ---------- ANALYST D10 0 ANALYST D20 2 ANALYST D30 0 CLERK D10 1 CLERK D20 2 CLERK D30 1 MANAGER D10 1 MANAGER D20 1 MANAGER D30 1 PRESIDENT D10 1 PRESIDENT D20 0 PRESIDENT D30 0 SALESMAN D10 0 SALESMAN D20 0 SALESMAN D30 4 PIVOT 結果 UNPIVOT 結果 17

Oracle Database の集計処理分析関数 ( ウィンドウ関数 ) 行のグループ (= ウィンドウ ) に基づいて集計値を計算する関数 (= ファンクション ) 集計関数と分析関数の違い 例 : 同じ部署 集計関数 : SUM() MAX() MIN() 集計結果 集合 (GROUP BY) 集計関数 グループ 1 グループ 1 グループ 2 グループ 1 グループ 1 グループ 1 グループ 2 グループ 1 行のグループ ( ウィンドウ ) 例 ) グループ内の順序 :1 例 ) グループ内の順序 :5 例 ) グループ内の順序 :1 例 ) グループ内の順序 :2 例 ) グループ内の順序 :4 例 ) グループ内の順序 :6 例 ) グループ内の順序 :2 例 ) グループ内の順序 :3 分析結果 分析関数 18

Oracle Database の集計処理分析関数 : 結果セット パーティション 行グループ内でソートした結果に対して分析関数を適用できます SELECT ename, FROM emp deptno, sal, RANK() OVER (PARTITION BY deptno ORDER BY deptno, sal desc; PARTITION 設定しない場合は 全体の行に対して RANK() をおこなう 分析関数で利用するパーティションは 表パーティション機能とは無関係です RANK() OVER を利用 ORDER BY sal DESC) AS rnk 行のグループ ( ウィンドウ ) 結果セット パーティションの単位 (deptno) ENAME DEPTNO SAL RNK ------ ------- ----- ---- ソート KING 10 5000 1 CLARK 10 2450 2 MILLER 10 1300 3 FORD 20 3000 1 SCOTT 20 3000 1 JONES 20 2975 3 ADAMS 20 1100 4 SMITH 20 800 5 BLAKE 30 2850 1 ALLEN 30 1600 2 TURNER 30 1500 3 WARD 30 1250 4 MARTIN 30 1250 4 JAMES 30 950 6 19

Oracle Database の集計処理 MODEL 句 問合せ結果から多次元配列を作成し この配列に式 ( ルール ) を適用して新しい値を計算する機能 SQL には組み込みにくい計算 ( 時系列分析等 ) を組み込む SELECT 文 MODEL 構文 DIMENSION BY (deptno, job) MEASURES avg_sal MEASURES(avg_sal) RULES(,, -- RULE1 -- RULE2 RULE は計算式 deptno -- RULE3 ) ORDER BY job DIMENSION 多次元配列のイメージ 20

Oracle Database の集計処理 MODEL 句の例 Q) 部門 (deptno) 職種 (job) 毎の平均給与 および 仮の部門 (deptno=40) の職種 (job='manager') として すべての部門の職種 (job='manager') の平均金額を表示 SELECT * FROM ( SELECT deptno,job,avg(sal) avg_sal FROM emp GROUP BY deptno,job ) MODEL DIMENSION BY (deptno, job) MEASURES(avg_sal) RULES( ) avg_sal[40, 'MANAGER'] = ROUND(AVG(avg_sal)[ANY, 'MANAGER']) ORDER BY deptno,job; MODEL 句による SQL 10 1300 2450 5000 20 3000 950 2975 30 950 2850 1400 40 2758 ANALYST CLERK MANAGER PRESIDENT SALESMAN 多次元配列のイメージ DEPTNO JOB AVG_SAL ------ --------- -------- RULEに 10 CLERK 1300 よる導出 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 3000 RULE 次第で 20 CLERK 950 上書き可能 20 MANAGER 2975 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 1400 40 MANAGER 2758 実行結果 21

アジェンダ 集計処理今昔 Oracle Databaseの集計処理 効果的な集計処理 集計処理をおこなうSQLの比較 分析処理をおこなうSQLの比較 まとめ 22

集計処理をおこなう SQL の比較集計処理を 4 種類の SQL で記述してみる CUBE が適切なケース Q) 社員の所属している職種 (job) 毎 部門 (deptno) 毎の賃金 (sal) 合計 職種毎の賃金合計 部門毎の賃金合計 全社員の賃金合計を表示する SELECT job, deptno, SUM(sal) FROM emp GROUP BY job,deptno UNION ALL SELECT job, NULL deptno, SUM(sal) FROM emp GROUP BY job UNION ALL SELECT NULL job, deptno, SUM(sal) FROM emp GROUP BY deptno UNION ALL SELECT NULL job, NULL deptno, SUM(sal) FROM emp ORDER BY job,deptno UNION ALL SELECT job, deptno, SUM(sal) FROM emp GROUP BY CUBE(job,deptno) ORDER BY job,deptno; CUBE SELECT job, deptno, SUM(sal) FROM emp GROUP BY ROLLUP(job), ROLLUP(deptno) ORDER BY job,deptno; ROLLUP SELECT job,deptno, SUM(sal) FROM emp GROUP BY GROUPING SETS ( (job, deptno), (job), (deptno), () ) ORDER BY job,deptno; GROUPING SETS JOB DEPTNO SUM(SAL) --------- ------- -------- ANALYST 20 6000 ANALYST 6000 CLERK 10 1300 CLERK 20 1900 CLERK 30 950 CLERK 4150 MANAGER 10 2450 MANAGER 20 2975 MANAGER 30 2850 MANAGER 8275 PRESIDENT 10 5000 PRESIDENT 5000 SALESMAN 30 5600 SALESMAN 5600 10 8750 20 10875 30 9400 結果 29025 23

集計処理をおこなう SQL の比較 4 種類の SQL の処理時間比較 件数 :10,000,000 deptno のバリエーション :80 union all cube rollup 処理時間 ( 比率 ) grouping sets 0 0.2 0.4 0.6 0.8 1 1.2 テーブルにアクセスする回数が多い (UNION ALL) と性能は悪い GROUP BY 拡張も若干のばらつきがみられる 24

集計処理をおこなう SQL の比較 4 種類の SQL の実行計画 ( 抜粋 ) UNION ALL GROUPING SETS ROLLUP CUBE GROUP BY 拡張はすべて同じ実行計画ではなく それぞれ最適化されている 今回 わずかであるが性能が良かった CUBE は指定カラムのすべての組合せでサブ トータルが導出されるため 実際の利用局面はほとんど無い 可能な限り ROLLUP および GROUPING SETS を利用する 25

分析処理をおこなう SQL の比較知りたい情報を同じ行に並べる Q) 社員の情報と共に その社員の属する部門 JOB の人数および社員数を表示する EMPNO ENAME DEPTNO 部門人数職種人数社員数 ----- ------- ------ ------ ------- ----- 7369 SMITH 20 5 4 14 7499 ALLEN 30 6 4 14 7521 WARD 30 6 4 14 7566 JONES 20 5 3 14 7654 MARTIN 30 6 4 14 7698 BLAKE 30 6 3 14 7782 CLARK 10 3 3 14 7788 SCOTT 20 5 2 14 7839 KING 10 3 1 14 7844 TURNER 30 6 4 14 7876 ADAMS 20 5 4 14 7900 JAMES 30 6 4 14 7902 FORD 20 5 2 14 7934 MILLER 10 3 4 14 3 種類の SQL で表現可能 性能が良いのはどれか? 注意点は無いか? 1) SELECT リストの中でスカラ サブクエリを利用 2) インライン ビューとの結合 3) 分析関数を利用 14 行が選択されました 実行結果 26

分析処理をおこなう SQL の比較 3 種類の SQL 文 SELECT e.empno, e.ename, e.deptno, (SELECT COUNT(*) FROM emp ed WHERE e.deptno = ed.deptno) " 部門人数 ", (SELECT COUNT(*) FROM emp ej WHERE e.job = ej.job) " 職種人数 ", (SELECT COUNT(*) FROM emp ) " 社員数 " FROM emp e ORDER BY e.empno; SELECT e.empno, e.ename, e.deptno, ed.cnt " 部門人数 ", ej.cnt " 職種人数 ", et.cnt " 社員数 " FROM emp e, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) ed, (SELECT job, COUNT(*) cnt FROM emp GROUP BY job) ej, (SELECT COUNT(*) cnt FROM emp) et WHERE e.deptno = ed.deptno AND e.job = ej.job ORDER BY e.empno; SELECT リストの中でスカラ サブクエリを利用 インライン ビューとの結合 SELECT e.empno, e.ename, e.deptno, COUNT(*) OVER (PARTITION BY deptno) " 部門人数 ", COUNT(*) OVER (PARTITION BY job) " 職種人数 ", COUNT(*) OVER () " 社員数 " FROM emp e ORDER BY e.empno; 分析関数を利用 27

分析処理をおこなう SQL の比較 3 種類の SQL 文の性能比較 件数 :1,000,000 deptnoのバリエーション :10 80 1 部門数 10 2 部門数 10 3 部門数 10 1 1 部門数 80 2 部門数 80 処理時間 ( 比率 ) 3 部門数 80 0 10 20 30 40 50 60 1SELECT リストの中でスカラ サブクエリを利用 2 インライン ビューとの結合 3 分析関数を利用 件数 カーディナリティが増えると性能が悪くなる 28

分析処理をおこなう SQL の比較 3 種類の SQL 文の実行計画 ( 抜粋 ) SELECT リストの中でスカラ サブクエリを利用 インライン ビューとの結合 分析関数を利用 SELECT リストの中でスカラ サブクエリはなるべく利用しない ( 特にサブクエリで参照する表のデータ量が多い場合 ) 分析関数をつかうと 理解しやすい SQL が記述できるので利用を推奨 29

分析処理をおこなう SQL の比較分析関数を利用した場合の WHERE 句は注意 ( その 1) Q) 社員の情報と共に その社員の属する部門 JOB の人数および社員数を表示する なお deptno=10 のものだけを表示させる SELECT e.empno, e.ename, e.deptno, ed.cnt " 部門人数 ", ej.cnt " 職種人数 ", et.cnt " 社員数 " FROM emp e, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) ed, (SELECT job, COUNT(*) cnt FROM emp GROUP BY job) ej, (SELECT COUNT(*) cnt FROM emp) et WHERE e.deptno = ed.deptno AND e.job = ej.job AND e.deptno = 10 ORDER BY e.empno; インライン ビューとの結合 SELECT e.empno, e.ename, e.deptno, COUNT(*) OVER (PARTITION BY deptno) " 部門人数 ", COUNT(*) OVER (PARTITION BY job) " 職種人数 ", COUNT(*) OVER () " 社員数 " FROM emp e WHERE e.deptno = 10 ORDER BY e.empno; 絞り込みの条件追加 分析関数を利用 30

分析処理をおこなう SQL の比較分析関数を利用した場合の WHERE 句は注意 ( その 2) 分析関数の場合 結果が異なるものとなってしまうので注意 EMPNO ENAME DEPTNO 部門人数 職種人数 社員数 ----- ------- ------ ------ ------- ----- 7782 CLARK 10 3 3 14 7839 KING 10 3 1 14 7934 MILLER 10 3 4 14 3 行が選択されました EMPNO ENAME DEPTNO 部門人数 職種人数 社員数 ----- ------- ------ ------ ------- ----- 7782 CLARK 10 3 1 3 7839 KING 10 3 1 3 7934 MILLER 10 3 1 3 3 行が選択されました 分析関数は WHERE 句の後に適用される為 インライン ビューとの結合 分析関数を利用 SELECT e.empno, e.ename, e.deptno, COUNT(*) OVER (PARTITION BY deptno) " 部門人数 ", COUNT(*) OVER (PARTITION BY job) " 職種人数 ", COUNT(*) OVER () " 社員数 " FROM emp e WHERE e.deptno = 10 ORDER BY e.empno; 分析関数を利用 SELECT * FROM ( SELECT e.empno, e.ename, e.deptno, COUNT(*) OVER (PARTITION BY deptno) " 部門人数 ", COUNT(*) OVER (PARTITION BY job) " 職種人数 ", COUNT(*) OVER () " 社員数 " FROM emp e ) WHERE deptno = 10 全体をインライン ビュー化 ORDER BY empno ; 分析関数を利用 31

アジェンダ 集計処理今昔 Oracle Databaseの集計処理 効果的な集計処理 まとめ 32

まとめ SQL を効果的に利用することで 効率的に集計処理をおこなうことができます Oracle Database では効率的に集計処理をおこなう仕組みが以前のバージョンより提供されています GROUP BY 拡張 (ROLLUP CUBE GROUPING SETS) ピボット操作 分析関数 MODEL 句 GROUP BY 拡張の例 分析関数の利用例を説明しました 33

Appendix 参考資料 参考情報 マニュアル 書籍 Oracle Database データ ウェアハウス ガイド 11g リリース 2(11.2) http://download.oracle.com/docs/cd/e16338_01/server.112/b56309/toc.htm Anthony Molinaro 著 SQL クックブック ( 株 ) オライリージャパン http://www.oreilly.co.jp/books/9784873113159/ MODEL 句 (Oracle Database のバージョンは 10g) Oracle Database 10g の SQL MODEL 句 http://www.oracle.co.jp/grid/papers/db/sqlmodel.pdf 34

SQL 実行例に関する補足事項 SQL 実行例の動作確認は Oracle Database 11g R2(11.2.0.2) Enterprise Edition にておこなっています SQL 実行例の大部分はサンプル スキーマ SCOTT の EMP 表を利用しています 35

OTN ダイセミでスキルアップ!! 一般的な技術問題解決方法などを知りたい! セミナ資料など技術コンテンツがほしい! Oracle Technology Network(OTN) を御活用下さい http://forums.oracle.com/forums/main.jspa?categoryid=484 一般的技術問題解決には OTN 掲示版の データベース一般 をご活用ください OTN 掲示版は 基本的に Oracle ユーザー有志からの回答となるため 100% 回答があるとは限りません ただ 過去の履歴を見ると 質問の大多数に関してなんらかの回答が書き込まれております http://www.oracle.com/technetwork/jp/ondemand/index.html 過去のセミナ資料 動画コンテンツは OTN の OTN セミナーオンデマンドコンテンツ へ ダイセミ事務局にダイセミ資料を請求頂いても お受けできない可能性がございますので予めご了承ください ダイセミ資料は OTN コンテンツオンデマンドか セミナ実施時間内にダウンロード頂くようお願い致します 36

OTN セミナーオンデマンドコンテンツダイセミで実施された技術コンテンツを動画で配信中!! ダイセミのライブ感はそのままに お好きな時間で受講頂けます 最新情報つぶやき中 oracletechnetjp 人気コンテンツは? お勧め情報 公開予告など OTN トップページ http://www.oracle.com/technetwork/jp/index.html ページ左 基本リンク > OTN セミナーオンデマンド 掲載のコンテンツ内容は予告なく変更になる可能性があります 期間限定での配信コンテンツも含まれております お早めにダウンロード頂くことをお勧めいたします 37

Oracle エンジニアのための技術情報サイトオラクルエンジニア通信 http://blogs.oracle.com/oracle4engineer/ 最新情報つぶやき中 oracletechnetjp 技術資料 ダイセミの過去資料や製品ホワイトペーパー スキルアップ資料などを多様な方法で検索できます キーワード検索 レベル別 カテゴリ別 製品 機能別 コラム オラクル製品に関する技術コラムを毎週お届けします 決してニッチではなく 誰もが明日から使える技術の あ そうだったんだ! をお届けします オラクルエンジニア通信 38

Oracle Database の価格ご存知ですか? 1 問題 : Oracle Databaseの最小構成はいくらでしょうか? ヒント : Oracle Standard Edition Oneを 5Named User Plus( 指名ユーザ ) というのが最小構成です 2 問題 : Real Applications Clusters(RAC) Optionはいくらでしょうか? ヒント : RACはOracle Database Enterprise EditionのOptionです 答えはこちら ログイン不要の簡単見積もり ライセンス見積もりヘルプ 検索 39

IT プロジェクト全般に渡る無償支援サービス パフォーマンス診断サービス Web システムボトルネック診断サービス データベースパフォーマンス診断サービス 移行支援サービス SQL Server からの移行支援サービス DB2 からの移行支援サービス Sybase からの移行支援サービス MySQL からの移行支援サービス Postgre SQL からの移行支援サービス Access からの移行支援サービス Oracle Direct Concierge サービス NEW Oracle Application ServerからWeblogicへ移行支援サービス NEW システム構成診断サービス Oracle Database 構成相談サービス サーバー統合支援サービス 仮想化アセスメントサービス メインフレーム資産活用相談サービス BI EE アセスメントサービス 簡易業務診断サービス バージョンアップ支援サービス Oracle Database バージョンアップ支援サービス Weblogic Server バージョンアップ支援サービス Oracle Developer/2000(Froms/Reports) Web アップグレード相談サービス NEW オラクル社のエンジニアが直接ご支援しますお気軽にご活用ください! オラクル無償支援 検索 40

Oracle Enterprise Cloud Summit 開催 ~ クラウド環境のための強固な情報基盤 内容基調講演 2 個別セッション 12 基調講演 Roadmap to Cloud 定員 400 名 対 象 入場料 CIO 経営企画 情報システム部門マネージャ 開発者 管理者 情報システムアーキテクト 無料 主催日本オラクル株式会社 ソフトバンクモバイル株式会社取締役専務執行役員兼 CISO 阿多親市様 お申込み >>> http://www.oracle.co.jp/oecs2011/ 日本オラクル株式会社常務執行役員クラウド &EA 統括本部長三澤智光 41

1 日 5 組限定! 製品無償評価サービス 提供シナリオ一例 データベースチューニング 無停止アップグレード アプリケーション性能 負荷検証 Webシステム障害解析 インストールすることなく すぐに体験いただけます サービスご提供までの流れ 1. お問合せフォームより 製品評価サービス希望 と必要事項を明記し送信下さい 2. 弊社より接続方法手順書およびハンズオン手順書を送付致します 3. 当日は 弊社サーバー環境でインターネット越しに製品を体感頂けます Web 問い合わせフォーム サービスご提供には事前予約が必要です ダイデモ をキーワードに検索することで申し込みホームページにアクセスできます http://www.oracle.com/jp/direct/services/didemo-195748-ja.html 42

あなたにいちばん近いオラクル Oracle Direct まずはお問合せください Oracle Direct 検索 システムの検討 構築から運用まで IT プロジェクト全般の相談窓口としてご支援いたします システム構成やライセンス / 購入方法などお気軽にお問い合わせ下さい Web 問い合わせフォーム 専用お問い合わせフォームにてご相談内容を承ります https://secure.oracle.co.jp/direct/inquiry-form.php こちらから詳細確認のお電話を差し上げる場合がありますので ご登録されている連絡先が最新のものになっているか ご確認下さい フリーダイヤル 0120-155-096 月曜 ~ 金曜 9:00~12:00 13:00~18:00 ( 祝日および年末年始除く ) 43