SQL

この章では、Structured Query Language (SQL)の概要およびOracle AI DatabaseによるSQL文の処理方法を示します。

SQLの紹介

SQL (sequelと発音)は、すべてのプログラムおよびユーザーがOracleデータベースのデータにアクセスする際に使用する、セットベースの高レベルの宣言型コンピュータ言語である。

いくつかのOracleツールおよびアプリケーションでは、SQLの使用はマスクされていますが、すべてのデータベース・タスクはSQLを使用して実行されます。その他のデータ・アクセス方法を使用すると、Oracle AI Databaseに組み込まれているセキュリティが活用され、データのセキュリティと整合性が損われる可能性があります。

SQLはOracle AI Databaseなどのリレーショナル・データベースに対するインタフェースを提供します。SQLでは、次のようなタスクを1つの一貫した言語に統合します。

SQLは対話的に使用できます(つまり、文を手動でプログラムに入力できます)。SQL文はCまたはJavaなどの異なる言語で記述されたプログラム内に埋め込むこともできます。

関連情報:

SQLデータ・アクセス

コンピュータ言語は大きくなり、2つの種類があり、1つは実行対象を表す非手続き型宣言言語、もう1つは実行経経緯を表すC++およびJavaなどの手続き型語です。

SQLは、ユーザーが結果の導出方法ではなく目的とする結果を指定するという意味において、宣言型です。たとえば、次の文を使用すると、姓がKで始まる従業員のレコードを問い合せることができます。

データベースでは、データをナビゲートし、リクエストされた結果を取得するプロシージャを生成する作業を実行します。SQLの宣言型の性質により、論理レベルでデータを操作できます。実装の詳細は、データを操作する場合にのみ、考慮する必要があります。

SELECT   last_name, first_name
FROM     hr.employees
WHERE    last_name LIKE 'K%'
ORDER BY last_name, first_name;

データベースはWHERE条件(述語とも呼ばれる)を満たすすべての行を1つのステップで取得します。データベースは、ユーザー、別のSQL文またはアプリケーションに、これらの行をまとめて渡すことができます。アプリケーションで行を1つずつ処理する必要はなく、また、開発者が行の物理的な格納方法または取得方法を認識する必要もありません。

すべてのSQL文で、オプティマイザが使用されます。オプティマイザは、要求されたデータにアクセスする最も効率的な方法を決定するデータベースのコンポーネントです。Oracle Databaseでは、オプティマイザにジョブを適切に実行させるための技術もサポートされています。

関連項目: SQL文とSQLのその他の部分(演算子、ファンクションおよび書式モデルなど)の詳細は、Oracle AI Database SQL言語リファレンスを参照してください。

SQL規格

オラクル社は業界で承認されている標準への準拠に努め、SQLの規格協会に積極的に参加しています。

業界が認可している協会として、米国規格協会(ANSI)および国際標準化機構(ISO)があります。ANSIとISO/IECはともに、SQLがリレーショナル・データベースの標準言語として認められています。

SQL標準は10のパートで構成されます。1つのパート(SQL/RPR:2012)は2012年の新しいものです。2011年には、他の5つ部品が改訂されました。他の4つのパートは2008年バージョンで、元のままです。Oracle SQLにはANSI/ISO標準SQL言語に対応する多くの拡張機能が埋められており、Oracle AI Databaseのツールとアプリケーションを使用することで追加の文が提供されます。SQL*Plus、SQL DeveloperおよびOracle Enterprise Managerツールを使用すると、Oracleデータベースおよびそれらのツールで使用可能な追加の文または関数に対してANSI/ISO標準SQL文を実行できます。

関連情報:

SQL文の概要

Oracleデータベース内の情報に対して実行されるすべての操作は、SQL文を使用して実行されます。SQL文はコンピュータ・プログラムまたは命令で、識別子、パラメータ、変数、名前、データ型およびSQL予約文字で構成されます。ノート: SQL予約語は、SQLで特別な意味を持ち、他の目的には使用できません。たとえば、SELECTとUPDATEは予約語のため、表名には使用できません。

SQL文は、完全なSQL文と等価であることが必要です。次に例を示します。

SELECT last_name, department_id FROM employees

Oracle AI Databaseでは、完全なSQL文のみが実行されます。次のような不完全文を実行しようとすると、テキストの不足を示すエラーが発生します。

SELECT last_name;

Oracle SQL文は、次のカテゴリに分類されます。

データ定義言語(DDL)文(Data Definition Language (DDL) Statements)

データ定義言語(DLL)文は、スキーマ・オブジェクトに対し、定義、構造の変更および削除を実行します。

DDLを使用すると、オブジェクトにアクセスするアプリケーションを変更することなく、オブジェクトの属性を変更できます。たとえば、アプリケーションをリライトせずに、人事管理アプリケーションからアクセスできる表に列を追加できます。また、DDLを使用して、データベース・ユーザーがデータベース内で作業を実行している間に、オブジェクトの構造を変更することもできます。

具体的には、DDL文を使用すると次のことができます。

例10-1 DDL文

次の例では、DDL文を使用してplants表を作成した後、DMLを使用して表に2つの行を挿入します。次に、DDLを使用して表構造を変更し、この表に対するユーザーの読取り権限を付与および取り消してから、表を削除します。

CREATE TABLE plants
    ( plant_id    NUMBER PRIMARY KEY,
      common_name VARCHAR2(15) );

INSERT INTO plants VALUES (1, 'African Violet'); # DML statement

INSERT INTO plants VALUES (2, 'Amaryllis'); # DML statement

ALTER TABLE plants ADD
    ( latin_name VARCHAR2(40) );

GRANT READ ON plants TO scott;

REVOKE READ ON plants FROM scott;

DROP TABLE plants;

データベースがDDL文を実行する直前に暗黙的なCOMMITが行われ、直後にCOMMITまたはROLLBACKが行われます。次の例では、2つのINSERT文の後にALTER TABLE文が続くため、データベースによって2つのINSERT文がコミットされます。ALTER TABLE文が成功した場合は、この文はデータベースによってコミットされ、失敗した場合は、この文はデータベースによってロールバックされます。いずれの場合も、2つのINSERT文はすでにコミットされています。

関連情報:

データ操作言語(DML)文(Data Manipulation Language (DML) Statements)

データ操作言語(DML)文は、既存のスキーマ・オブジェクト内のデータの問合せや操作を行います。

DDL文ではデータベースの構造を変更するのに対して、DML文では内容の問合せまたは変更を行います。たとえば、ALTER TABLEは表の構造を変更するのに対して、INSERTは1つ以上の行を表に追加します。

DML文は、最も頻繁に使用するSQL文であり、次の操作を実行できます。

次の例では、DMLを使用してemployees表に問い合せます。例では、DMLを使用してemployeesに行を挿入し、この行を更新した後、行を削除します。

SELECT * FROM employees;

INSERT INTO employees (employee_id, last_name, email, job_id, hire_date, salary)
  VALUES (1234, 'Mascis', 'JMASCIS', 'IT_PROG', '14-FEB-2008', 9000);

UPDATE employees SET salary=9100 WHERE employee_id=1234;

DELETE FROM employees WHERE employee_id=1234;

論理作業単位を形成するDML文のコレクションは、トランザクションと呼ばれます。たとえば、預金を振り替えるトランザクションは、普通預金口座の残高の減額、当座預金口座の残高の増額および預金口座履歴表への振替えの記録という3つの別々の操作を伴います。DDL文とは異なり、DML文は現行のトランザクションを暗黙的にコミットしません。

関連情報:

SELECTステートメント

問合せは、表またはビューからデータを取得する操作である。

SELECTはデータの問合せに使用できる唯一のSQL文です。SELECT文の実行から取得した一連のデータは結果セットと呼ばれます。

次の表に、SELECT文でよく見られる1つの必須キーワードと3つのキーワードを示します。また、表では、キーワードとSELECT文の機能を関連付けています。

表1 SQL文のキーワード

キーワード 必須? 摘要 能力
SELECT はい

結果に表示される列を指定します。投影により、表内の列のサブセットが作成されます。

式は、値に解決される1つ以上の値、演算子、およびSQLファンクションの組合せです。SELECTキーワードの後かつFROM句の前に置かれた式のリストはselect listと呼ばれます。

予測
FROM いいえ データの取得元の表またはビューを指定します。 結合
WHERE いいえ 条件を指定して行をフィルタ処理し、表内の行のサブセットを作成します。条件は、1つ以上の式および論理(ブール)演算子の組合せを指定し、TRUE、FALSEまたはUNKNOWNの値を戻します。 選択
ORDER BY いいえ 行の表示順序を指定します。  

関連項目: SELECTの構文およびセマンティクスについては、『Oracle AI Database SQL言語リファレンス』を参照してください

結合

結合とは、2つ以上の表、ビューまたはマテリアライズド・ビューの行を組み合せる問合せのことです。

次の例は、employees表およびdepartments表を結合して(FROM句)、指定した条件に一致する行のみを選択し(WHERE句)、投影を使用して2つの列からデータを取得します(SELECT)。SQL文の後にサンプルの出力を示しています。

SELECT email, department_name
FROM   employees
JOIN   departments
ON     employees.department_id = departments.department_id
WHERE  employee_id IN (100,103)
ORDER BY email;

EMAIL                     DEPARTMENT_NAME
------------------------- ------------------------------
AHUNOLD                   IT
SKING                     Executive

次の図に、前述の問合せの結合で示した投影および選択の操作を表します。

図1: 投影と選択

画像cncpt290.gifの説明

ほとんどの結合には、FROM句またはWHERE句のいずれかに1つ以上の結合条件があり、それぞれ異なる表の2つの列をこの基準によって比較します。データベースでは1対の行を組み合せ、それぞれの対には、結合条件がTRUEになる各表の行を1行ずつ含みます。オプティマイザは結合条件、索引、および表に使用できる任意の統計に基づいて、データベースが表を結合する順序を決定します。

結合タイプは次のとおりです。

関連情報:

サブクエリー

副問合せとは、別のSQL文内にネストされたSELECT文のことです。副問合せは、1つの問題を解決するために複数の問合せを実行する必要がある場合に便利です。

文の各問合せ部分は、問合せブロックと呼ばれます。次の問合せでは、カッコ内の副問合せが内部問合せブロックです。

SELECT first_name, last_name
FROM   employees
WHERE  department_id
IN     ( SELECT department_id
         FROM departments
         WHERE location_id = 1800 );

内部SELECT文により、場所IDが1800の部門のIDが取得されます。これらの部門IDは、副問合せによってIDが戻された部門の従業員名を取得する外部問合せブロックに必要です。

このSQL文の構造では、内部問合せを最初に実行することをOracle Databaseに強制しているわけではありません。たとえば、Oracle Databaseにより問合せ全体がemployeesとdepartmentsの結合としてリライトされることもあり、その場合は副問合せ自体が実行されません。また、別の例として、Virtual Private Database (VPD)機能では、WHERE句を使用して従業員の問合せが絞り込まれることがあり、この場合は、Oracle Databaseでは、最初に従業員を問い合せてから部門IDが取得されます。オプティマイザにより、要求された行を取得するためのステップの最適な順序が決定されます。

関連項目: VPDについてさらに学習するには、『Oracle AI Databaseセキュリティ・ガイド』を参照してください

取引制御文

トランザクション制御文は、DML文による変更を管理し、DML文をトランザクションにグループ化します。

これらの文によって、次のことを実行できます。

次の例はUpdate salariesという名前のトランザクションを開始します。例ではセーブポイントを作成し、従業員の給与を変更した後、セーブポイントまでトランザクションをロールバックします。さらに、給与を別の値に更新してコミットします。

SET TRANSACTION NAME 'Update salaries';

SAVEPOINT before_salary_update;

UPDATE employees SET salary=9100 WHERE employee_id=1234 # DML

ROLLBACK TO SAVEPOINT before_salary_update;

UPDATE employees SET salary=9200 WHERE employee_id=1234 # DML

COMMIT COMMENT 'Updated salaries';

関連情報:

セッション制御ステートメント

セッション制御文は、ユーザー・セッションのプロパティを動的に管理します。

セッションは、データベースに現在ログインしているユーザーの状態を示すデータベース・インスタンス・メモリーの論理エンティティです。セッションは、ユーザーがデータベースに認証された時点から、ユーザーが接続を切断するか、データベース・アプリケーションを終了する時点まで続きます。

セッション制御文によって、次のことを実行できます。

次の文は、セッションのデフォルトの日付形式を動的に'YYYY MM DD-HH24:MI:SS'に変更します。

ALTER SESSION
   SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS';

セッション制御文は現行のトランザクションを暗黙的にコミットしません。

関連情報:

システム制御ステートメント

システム制御文によって、データベース・インスタンスのプロパティが変更されます。

システム制御文は、ALTER SYSTEMのみです。この文は、設定値(共有サーバーの最小数など)の変更、セッションの終了およびその他のシステム・レベルでのタスクの実行に使用します。

システム制御文の例を次に示します。

ALTER SYSTEM SWITCH LOGFILE;

ALTER SYSTEM KILL SESSION '39, 23';

ALTER SYSTEM文は現行のトランザクションを暗黙的にコミットしません。

関連項目: ALTER SYSTEMの構文およびセマンティクスについては、『Oracle AI Database SQL言語リファレンス』

埋込みSQL文

埋込みSQL文は、手続き型言語プログラム内にDDL、DMLおよびトランザクション制御文を取り込みます。

埋込み文は、Oracleプリコンパイラで使用されます。埋込みSQLは、手続き型言語アプリケーションにSQLを取り込むための1つの方法です。他に、Open Database Connectivity(ODBC)またはJava Database Connectivity(JDBC)などの手続き型APIを使用する方法もあります。

埋込みSQL文によって、次のことを実行できます。

関連情報:

オプティマイザの概要

Oracle AI DatabaseがSQL文を処理する仕組みを理解するには、データベースのオプティマイザと呼ばれる部分(問合せオプティマイザまたはコストベース・オプティマイザとも呼ばれる)を把握する必要があります。すべてのSQL文でオプティマイザを使用して、指定されたデータへの最も効率的なアクセス手段を決定します。

オプティマイザの使用

オプティマイザは、使用可能な実行方法を表す実行計画を生成します。

オプティマイザにより、いくつかの情報ソースが考慮されて、最も効率的な実行計画が決定されます。たとえば、オプティマイザでは、問合せ条件、使用可能なアクセス・パス、収集された対象システムの統計、ヒントなどが考慮されます。

DML文を実行するために、Oracle AI Databaseで多くの処理を必要とする場合があります。各処理では、データベースからデータ行を物理的に検索するか、文を発行したユーザーのためにデータ行を準備します。データベースがSQL文を実行するときに使用するステップは、文の実行速度に大きな影響を与えます。多くの場合、DML文の処理には多くの様々な方法を使用できます。たとえば、表または索引のアクセス順序を変更できます。

SQL文の最適な実行計画を決定する際に、オプティマイザは次の操作を実行します。

オプティマイザは、問合せの処理に使用できる方法の大部分を生成し、生成した実行計画の各ステップにコストを割り当てます。コストが最も低い計画が、実行する問合せ計画として選択されます。

ノート: SQL文の実行計画は、その計画を実行しなくても取得できます。データベースが問合せの実行に実際に使用する実行計画は、適切に規定された問合せ計画のみです。

オプティマイザの目標を設定して、オプティマイザの代表的な統計を収集することにより、オプティマイザの選択を変えることができます。たとえば、オプティマイザの目的を次のいずれかに設定できます。

典型的なエンド・ユーザーの対話型アプリケーションの場合、初期レスポンス時間による最適化が有用であるのに対して、バッチモードの非対話型アプリケーションの場合、合計スループットによる最適化が有用です。

関連情報:

オプティマイザ・コンポーネント

オプティマイザには、3つの主要コンポーネント(トランスフォーマ、エスティメータおよびプラン・ジェネレータ)が含まれています。

次の図は、そのコンポーネントを示しています。

図2: オプティマイザのコンポーネント

画像cncpt287.gifの説明

オプティマイザには、解析済の問合せが入力されます。オプティマイザは、次の操作を実行します。

  1. オプティマイザは解析済の問合せを受け取り、使用可能なアクセス・パスおよびヒントに基づいてSQL文に対する一連の計画候補を生成します。

  2. オプティマイザは、データ・ディクショナリ内の統計に基づき、各計画のコストを見積ります。コストとは、特定の計画を使用して文を実行するために必要な、予想されるリソース使用に比例した見積り値です。

  3. オプティマイザは、計画のコストを比較し、コストが最も低い計画(「問合せ計画」と呼ばれる)を選択して、行ソース・ジェネレータに渡します。

関連情報:

問合せトランスフォーマ

問合せトランスフォーマは、オプティマイザがより優れた実行計画を生成できるように、問合せの形式を変更することが有用かどうかを判断します。問合せトランスフォーマへの入力は解析済の問合せで、オプティマイザでは問合せブロックのセットとして表されます。

関連項目: 「クエリー・リライト」

エスティメータ

エスティメータは、指定された実行計画の全体コストを判断します。

エスティメータは、この目標を達成するために3つのタイプの異なる計測を生成します。

統計が使用可能な場合、エスティメータはこれらの統計を使用してメジャーを計算します。統計によって、メジャーの正確さの度合いは改良されます。

プラン・ジェネレータ

プラン・ジェネレータは、発行された問合せに対して異なる計画を試行します。オプティマイザは、コストが最も低い計画を選択します。

ネストされた副問合せおよびマージされていないビューごとに、オプティマイザはサブプランを生成します。オプティマイザでは、各サブプランが個別の問合せブロックとして表されます。プラン・ジェネレータは、異なるアクセス・パス、結合方法および結合順序を試行することによって、問合せブロックに対して様々な計画を探索します。

適応問合せ最適化機能により、文の実行中に収集された統計に基づいて計画が変更されています。すべての適応メカニズムでは、デフォルトの計画とは異なる、文の最終計画を実行できます。適応最適化では、文の実行中にサブプランの中から選択する動的プラン、または現在の実行後の実行でプランを変更する再最適化のいずれかを使用します。

関連情報:

アクセス・パス

アクセス・パスとは、問合せで行の取得に使用される手法のことです。

たとえば、索引を使用する問合せは、索引を使用しない問合せとは異なるアクセス・パスになります。通常、表内の行の小規模なサブセットを取得する文には、索引アクセス・パスが最適です。表内の大きな一部分にアクセスするには、全体スキャンがより効率的です。

データベースは、表からデータを取得するために、複数の異なるアクセス・パスを使用できます。代表的なものは次のとおりです。

オプティマイザは、文に対して使用可能なアクセス・パスと、各アクセス・パスまたはパスの組合せの使用時の見積りコストに基づいて、1つのアクセス・パスを選択します。

関連項目:アクセス・パスについて学習するには、Oracle AI Databaseパフォーマンス・チューニング・スタート・ガイドおよびOracle AI Database SQLチューニング・ガイドを参照してください。

オプティマイザ統計

オプティマイザ統計は、データベースの詳細とデータベース内のオブジェクトを記述したデータのコレクションです。統計は、データ・ストレージと分散に関して統計的に正しい実態を示すもので、アクセス・パスを評価する際にオプティマイザによって使用されます。

オプティマイザ統計には、次が含まれます。

Oracle AI Databaseは、すべてのデータベース・オブジェクトのオプティマイザ統計を自動的に収集し、これらの統計を自動メンテナンス・タスクとして保持します。また、DBMS_STATSパッケージを使用して、手動で統計を収集することもできます。このPL/SQLパッケージでは、統計を変更、表示、エクスポート、インポートおよび削除できます。ノート:オプティマイザ統計は問合せの最適化を目的として作成され、データ・ディクショナリに格納されます。これらの統計と動的パフォーマンス・ビューを介して表示できるパフォーマンス統計を混同しないでください。

オプティマイザ統計アドバイザは、現在の統計収集の状況、既存の統計収集ジョブの有効性、および収集された統計の品質を分析するビルトイン診断ソフトウェアです。オプティマイザ統計アドバイザでは、現在の機能セットに基づくOracleのベスト・プラクティスが組み込まれたルールが管理されます。このように、アドバイザは常に統計収集のための最新の推奨事項を提供します。

関連情報:

オプティマイザ・ヒント

ヒントとは、オプティマイザへの指示として機能するSQL文内のコメントのことです。

特定のアプリケーションのデータについて、オプティマイザよりも多くの情報を持つアプリケーションデザイナーであれば、より効率的なSQL文を実行する方法を選択できる場合もあります。アプリケーション設計者は、SQL文内にヒントを使用して文の実行方法を指定できます。次の例では、ヒントの使用方法を示します。

例10-2 FIRST_ROWSヒントを指定したSELECTの実行計画

対話型アプリケーションによって、50行を戻す問合せが実行されるとします。このアプリケーションでは、問合せによって戻される最初の25行のみを初めにフェッチしてエンド・ユーザーに表示します。オプティマイザを使用して、最初の25レコードを可能なかぎり迅速に取得する計画を生成し、ユーザーが待たずに済むようにします。この指示をオプティマイザに渡すには、次の例のSELECT文およびAUTOTRACE出力に示すように、ヒントを使用します。

SELECT /*+ FIRST_ROWS(25) */ employee_id, department_id
FROM   hr.employees
WHERE  department_id > 50;

------------------------------------------------------------------------
| Id | Operation                    | Name              | Rows | Bytes
------------------------------------------------------------------------
|  0 | SELECT STATEMENT             |                   | 26   | 182
|  1 |  TABLE ACCESS BY INDEX ROWID | EMPLOYEES         | 26   | 182
|* 2 |   INDEX RANGE SCAN           | EMP_DEPARTMENT_IX |      |
------------------------------------------------------------------------

この例では、実行計画は、オプティマイザがemployees.department_id列の索引を選択して部門IDが50を超えるemployeesの最初の25行を検索することを示します。オプティマイザは索引から取得したROWIDを使用してemployees表からレコードを取得し、クライアントに戻します。通常、最初のレコードの取得はほとんど即時です。

例10-3 ヒントを指定しないSELECTの実行計画

オプティマイザ・ヒントを指定しない同じ文を実行するとします。

SELECT employee_id, department_id
FROM   hr.employees
WHERE  department_id > 50;

------------------------------------------------------------------------
| Id | Operation              | Name              | Rows | Bytes | Cos
------------------------------------------------------------------------
|  0 | SELECT STATEMENT       |                   | 50   | 350   |
|* 1 |  VIEW                  | index$_join$_001  | 50   | 350   |
|* 2 |   HASH JOIN            |                   |      |       |
|* 3 |    INDEX RANGE SCAN    | EMP_DEPARTMENT_IX | 50   | 350   |
|  4 |    INDEX FAST FULL SCAN| EMP_EMP_ID_PK     | 50   | 350   |

この場合、実行計画では2つの索引を結合して、可能なかぎり迅速に要求されたレコードを戻します。オプティマイザは、例10-2のように索引から表へと繰り返し移動するのではなく、EMP_DEPARTMENT_IXのレンジ・スキャンを選択して、部門IDが50を超えるすべての行を検索し、ハッシュ表にこれらの行を配置します。オプティマイザは次に、EMP_EMP_ID_PK索引を読み取ることを選択します。この索引の各行について、ハッシュ表を調査して部門IDを検索します。

この場合、EMP_DEPARTMENT_IXの索引レンジ・スキャンが完了するまで、データベースはクライアントに最初の行を戻すことができません。このため、生成されたこの計画では最初のレコードを戻すために、より長い時間がかかります。索引のROWIDによって表にアクセスする例10-2の計画とは異なり、計画はマルチブロックI/Oを使用し、読取りの範囲が大きくなります。読取りによって、全結果セットの最後の行をより迅速に戻すことができます。

関連項目:オプティマイザ・ヒントの使用方法を学習するには、Oracle AI Database SQLチューニング・ガイドを参照してください。

SQL処理の概要

この項では、Oracle AI DatabaseによるSQL文の処理方法について説明します。特に、データベースがDDL文を処理してオブジェクトを作成する仕組み、DMLでデータを変更する仕組、問合せを使用してデータを取得する仕組について説明します。

SQL処理の段階

SQL処理の一般的な段階は、解析、最適化、行ソース生成、および実行です。文によっては、データベースがこれらのステップの一部を省略する場合があります。

次の図は、一般的な段階を示しています:

図3: SQL処理の段階

画像cncpt250.gifの説明

SQL解析

SQL処理の最初の段階は、SQLの解析です。この段階では、SQL文の各部分を他のルーチンで処理できるデータ構造に分解します。

アプリケーションがSQL文を発行すると、アプリケーションはOracle Databaseに解析コールを出して、文の実行を準備します。解析コールは、解析済のSQL文と処理に使用するその他の情報が保持されるセッション固有のプライベートSQL領域のハンドルであるカーソルがオープンまたは作成されます。カーソルおよびプライベートSQL領域はPGA内にあります。

解析コール時には、データベースでは次のチェックを実行します。

これらのチェックにより、文の実行前に検出できるエラーを特定します。解析では捕捉できないエラーもあります。たとえば、データベースで、文の実行時にのみ、データ変換に関してデッドロックまたはエラーが発生する場合があります。

データベースは、解析フェーズ中にORA-00600エラーで失敗したSQL文に対して自動エラー緩和を試行します。ORA-00600は重大なエラーです。プロセスにおいて、低レベルの予期しない状態が発生したことを示します。解析フェーズ中にこのエラーでSQL文が失敗すると、自動エラー軽減によってSQL文はトラップされ、条件の解決が試行します。解決策が見つかった場合、データベースによってSQL実行計画を調整するためにSQLパッチが生成されます。このパッチにより解析が正常に完了できるようになる場合、ORA-00600エラーは発生しません。アプリケーションでは例外は表示されません。

関連項目: ロックおよびデッドロック SQLエラーの自動軽減について

SQLの最適化

問合せの最適化は、SQL文を実行する最も効率的な方法を選択するプロセスである。

データベースは、アクセスする実際のデータに関して収集した統計に基づいて、問合せを最適化します。オプティマイザでは、行数、データ・セットのサイズおよびその他の要因を使用して、使用可能な実行計画を生成し、各計画に数値コストを割り当てます。コストが最も低い計画が使用されます。

データベースは一意のDML文ごとに必ず1回以上のハード解析を実行して、この解析中に最適化を実行します。最適化を要求する副問合せなどのDMLコンポーネントを含まないかぎり、DDLは最適化されません。

関連情報:

SQL行ソース生成

行ソース・ジェネレータは、オプティマイザから最適な実行計画を受け取り、データベースのその他の部分で使用できる問合せ計画と呼ばれる反復実行計画を作成するソフトウェアです。

問合せ計画はステップを組み合せた形式になります。各ステップは、行セットを返します。このセット内の行は次のステップまたは最後のステップのいずれかで使用され、SQL文を発行するアプリケーションに返されます。

行ソースは、行を反復的に処理できる制御構造に沿って、実行計画のステップから戻された行セットになります。行ソースは、表、ビュー、または結合またはグループ化操作の結果になる可能性があります。

SQL実行

実行時には、SQLエンジンによって行ソース・ジェネレータによって作成されたツリー内の各行ソースを実行します。これのみがDML処理の必須ステップです。

実行中、データがメモリー内にない場合は、データベースがディスクからメモリーへとデータを読み取ります。また、データベースはデータ整合性を保証するために必要なすべてのロックおよびラッチを取り除き、SQL実行時に行われたすべての変更を記録します。SQL文処理の最後のステージでは、カーソルがクローズされます。

データベースがインメモリ列ストア(IM列ストア)を使用するように構成されている場合、データベースは問合せを、可能な場合はIM列ストアに、さもなければディスクおよびデータベース・バッファ・キャッシュに透過的にルーティングします。1つの問合せでも、IM列ストア、ディスク、バッファ・キャッシュを使用できます。たとえば、ある問合せで2つの表を結合し、そのうち1つのみがIM列ストアにキャッシュされていることがあります。

関連情報:

DML処理とDDL処理の違い

Oracle AI DatabaseはDMLとは異なる方法でDDLを処理します。

たとえば、表を作成するとき、データベースはCREATE TABLE文を最適化しません。かわりに、Oracle AI DatabaseはDDL文を解析してコマンドを実行します。

DDLとは対照的に、ほとんどのDML文には問合せコンポーネントがあります。問合せでカーソルを実行すると、問合せで生成された行が結果セットに入力されます。

データベースでは、結果セットの行を一度に1行ずつまたはグループとしてまとめてフェッチできます。フェッチでは、データベースで行が選択され、問合せで要求された場合には行がソートされます。最後の行がフェッチされるまで、毎回のフェッチで結果の行が連続して取得されます。

関連項目: DDLの処理、トランザクション制御およびその他のタイプの文について学習するには、Oracle AI Database開発ガイドを参照してください。