Oracle Database

エンタープライズ向け高性能データベース。Oracle 23aiでAI Vector Search機能を本格導入。300以上の新機能でAI統合を強化。

データベースRDBMSエンタープライズSQLPL/SQL商用データベース

データベースサーバー

Oracle Database

概要

Oracle Databaseは、世界で最も広く使用されているエンタープライズ向けリレーショナルデータベース管理システム(RDBMS)です。高い可用性、パフォーマンス、スケーラビリティを提供し、ミッションクリティカルなアプリケーションのデータ管理に最適化されています。1979年に最初のバージョンがリリースされて以来、継続的に進化を続け、最新版では自律型データベース機能やマルチテナントアーキテクチャなど、革新的な機能を搭載しています。

詳細

Oracle Databaseは、エンタープライズレベルの要求に対応する包括的なデータ管理プラットフォームです。SQL標準に準拠しながら、独自の拡張機能やPL/SQLプログラミング言語を提供し、複雑なビジネスロジックをデータベース層で実装できます。

主要な特徴として、Real Application Clusters(RAC)による高可用性、Partitioningによる大規模データの効率的な管理、Advanced Securityによる強固なセキュリティ機能があります。また、In-Memory機能により、OLTPとOLAPの両方のワークロードで優れたパフォーマンスを実現します。

Oracle Databaseは、オンプレミス、クラウド、ハイブリッド環境で展開可能で、Oracle Cloud Infrastructure上では自律型データベースとして提供され、自動チューニング、自動パッチ適用、自動バックアップなどの管理タスクを自動化します。

エディションは、Enterprise Edition、Standard Edition 2、Express Edition(無料版)があり、組織の規模や要件に応じて選択できます。ライセンスモデルは、プロセッサライセンスとネームドユーザープラスライセンスの2種類が主流で、使用する機能に応じて追加のオプションやパックが必要になる場合があります。

メリット・デメリット

メリット

  • 高い信頼性と可用性: RACによるクラスタリング、Data Guardによるディザスタリカバリなど、エンタープライズレベルの可用性機能
  • 優れたパフォーマンス: In-Memory機能、パーティショニング、並列処理による高速なデータ処理
  • 包括的なセキュリティ: 暗号化、監査、アクセス制御、データマスキングなど、多層的なセキュリティ機能
  • スケーラビリティ: 垂直・水平両方のスケーリングに対応し、ペタバイト級のデータを扱える
  • 豊富な管理ツール: Enterprise Manager、SQL Developer、AWR/ADDMなど、充実した管理・監視ツール
  • 強力なSQL拡張: PL/SQL、分析関数、JSONサポートなど、高度なデータ処理機能
  • マルチテナント: コンテナデータベースによる効率的なリソース管理とアプリケーション分離
  • 長期サポート: 長期間のサポートとパッチ提供により、安定した運用が可能

デメリット

  • 高額なライセンス費用: エンタープライズ向け機能は非常に高価で、オプションやパックも追加費用が必要
  • 複雑なライセンス体系: プロセッサ、ユーザー、機能別のライセンスが複雑で、コンプライアンス管理が困難
  • 学習曲線が急: 高度な機能を活用するには専門的な知識と経験が必要
  • リソース要求が高い: 大量のメモリとCPUリソースを必要とし、適切なチューニングが不可欠
  • ベンダーロックイン: Oracle固有の機能への依存により、他のデータベースへの移行が困難
  • 初期設定の複雑さ: インストールと初期設定が複雑で、最適な構成には専門知識が必要
  • ライセンス監査リスク: Oracleの厳格なライセンス監査により、追加費用のリスクがある

参考ページ

書き方の例

基本的な接続とクエリ

-- SQL*Plusまたはお使いのクライアントツールでの接続
CONNECT username/password@hostname:port/service_name

-- 簡単なSELECT文
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 10
ORDER BY salary DESC;

-- テーブルの作成
CREATE TABLE products (
    product_id    NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    product_name  VARCHAR2(100) NOT NULL,
    price         NUMBER(10,2) CHECK (price > 0),
    created_date  DATE DEFAULT SYSDATE
);

PL/SQLストアドプロシージャ

-- ストアドプロシージャの作成
CREATE OR REPLACE PROCEDURE update_employee_salary (
    p_employee_id  IN  NUMBER,
    p_percentage   IN  NUMBER,
    p_new_salary   OUT NUMBER
) AS
    v_current_salary NUMBER;
BEGIN
    -- 現在の給与を取得
    SELECT salary INTO v_current_salary
    FROM employees
    WHERE employee_id = p_employee_id
    FOR UPDATE;
    
    -- 新しい給与を計算
    p_new_salary := v_current_salary * (1 + p_percentage / 100);
    
    -- 給与を更新
    UPDATE employees
    SET salary = p_new_salary,
        last_update_date = SYSDATE
    WHERE employee_id = p_employee_id;
    
    COMMIT;
    
    DBMS_OUTPUT.PUT_LINE('給与が正常に更新されました。');
    
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20001, '従業員が見つかりません');
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END update_employee_salary;
/

-- プロシージャの実行
DECLARE
    v_new_salary NUMBER;
BEGIN
    update_employee_salary(100, 10, v_new_salary);
    DBMS_OUTPUT.PUT_LINE('新しい給与: ' || v_new_salary);
END;
/

パーティショニング

-- レンジパーティションテーブルの作成
CREATE TABLE sales (
    sale_id      NUMBER,
    sale_date    DATE,
    product_id   NUMBER,
    quantity     NUMBER,
    amount       NUMBER(10,2)
) 
PARTITION BY RANGE (sale_date) (
    PARTITION sales_2023_q1 VALUES LESS THAN (DATE '2023-04-01'),
    PARTITION sales_2023_q2 VALUES LESS THAN (DATE '2023-07-01'),
    PARTITION sales_2023_q3 VALUES LESS THAN (DATE '2023-10-01'),
    PARTITION sales_2023_q4 VALUES LESS THAN (DATE '2024-01-01'),
    PARTITION sales_future VALUES LESS THAN (MAXVALUE)
);

-- パーティションの追加
ALTER TABLE sales 
ADD PARTITION sales_2024_q1 VALUES LESS THAN (DATE '2024-04-01');

-- パーティションのメンテナンス
ALTER TABLE sales DROP PARTITION sales_2023_q1;

JSONデータの操作

-- JSONデータを含むテーブルの作成
CREATE TABLE customer_orders (
    order_id    NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    order_date  DATE,
    order_data  JSON
);

-- JSONデータの挿入
INSERT INTO customer_orders (order_date, order_data)
VALUES (SYSDATE, JSON('{
    "customer": {
        "id": 12345,
        "name": "田中太郎",
        "email": "[email protected]"
    },
    "items": [
        {"product_id": 1, "quantity": 2, "price": 1000},
        {"product_id": 2, "quantity": 1, "price": 2500}
    ],
    "total": 4500
}'));

-- JSONデータのクエリ
SELECT o.order_id, 
       o.order_data.customer.name AS customer_name,
       o.order_data.total AS total_amount
FROM customer_orders o
WHERE o.order_data.customer.id = 12345;

-- JSON_TABLEを使用した詳細な分析
SELECT o.order_id, j.*
FROM customer_orders o,
     JSON_TABLE(o.order_data, '$.items[*]'
         COLUMNS (
             product_id NUMBER PATH '$.product_id',
             quantity   NUMBER PATH '$.quantity',
             price      NUMBER PATH '$.price'
         )
     ) j
WHERE o.order_date >= DATE '2024-01-01';

パフォーマンスチューニング

-- 実行計画の取得
EXPLAIN PLAN FOR
SELECT /*+ INDEX(e emp_dept_idx) */ 
       e.employee_id, e.first_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > 50000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- AWRレポートの生成(Diagnostics Packライセンス必要)
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;

-- SQL Tuning Advisor の使用(Tuning Packライセンス必要)
DECLARE
    l_sql_tune_task_id VARCHAR2(100);
BEGIN
    l_sql_tune_task_id := DBMS_SQLTUNE.CREATE_TUNING_TASK(
        sql_text => 'SELECT * FROM employees WHERE salary > 50000',
        user_name => USER,
        scope => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE,
        time_limit => 300,
        task_name => 'emp_sal_tuning_task'
    );
    
    DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => 'emp_sal_tuning_task');
END;
/

-- チューニング推奨事項の確認
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('emp_sal_tuning_task') FROM DUAL;

セキュリティ機能

-- 透過的データ暗号化(TDE)の有効化
-- (Advanced Securityオプションライセンス必要)
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "encryption_password";
ALTER TABLESPACE users ENCRYPTION ONLINE USING 'AES256' ENCRYPT;

-- 仮想プライベートデータベース(VPD)ポリシーの作成
CREATE OR REPLACE FUNCTION emp_security_policy(
    p_schema VARCHAR2,
    p_object VARCHAR2
) RETURN VARCHAR2 AS
BEGIN
    -- 各ユーザーは自分の部門のデータのみアクセス可能
    RETURN 'department_id = SYS_CONTEXT(''USERENV'', ''CLIENT_INFO'')';
END;
/

BEGIN
    DBMS_RLS.ADD_POLICY(
        object_schema   => 'HR',
        object_name     => 'EMPLOYEES',
        policy_name     => 'EMP_DEPT_POLICY',
        function_schema => 'HR',
        policy_function => 'EMP_SECURITY_POLICY',
        statement_types => 'SELECT, INSERT, UPDATE, DELETE'
    );
END;
/

-- 監査の有効化
AUDIT SELECT, INSERT, UPDATE, DELETE ON employees BY ACCESS;
AUDIT CREATE SESSION;