ROWNUM疑似列は、問合せによって戻される各行について、表や結合処理された行の集合か
らOracleが行を選択する順序を示す番号を戻します。つまり、選択される最初の行の
ROWNUMは1、2番目の行のROWNUMは2です(以降同様に続きます)。
次の例のように、ROWNUMを使用して問合せによって戻される行数を制限できます。
SELECT * FROM emp WHERE ROWNUM < 10;
参照 参照参照
参照: 2-20ページの「UROWIDデータ型」および2-18ページの
「ROWIDデータ型」を参照してください。
同じ問合せでROWNUMにORDERBY句が続く場合、ORDERBY句によって行が再び順序付け られます。結果は、行がアクセスされる方法によって異なります。たとえば、ORDER BY句 の指定によってOracleが索引を使用してデータにアクセスする場合、索引なしの場合とは 異なる順序で行が取り出されることがあります。そのため、後続の文には前述の例と同じ効 果はありません。
SELECT * FROM emp WHERE ROWNUM < 11 ORDER BY empno;
ORDERBY句を副問合せに埋め込んでROWNUM条件をトップレベル問合せに置いた場合、行 の順序付けの後でROWNUM条件を強制的に適用させることができます。たとえば、次の問合 せは、小さい順から10個の従業員数を戻します。これは、top-N queryと呼ばれることがあ ります。
SELECT * FROM
(SELECT empno FROM emp ORDER BY empno) WHERE ROWNUM < 11;
前述の例では、ROWNUM値はトップレベルのSELECT文の値です。これらの値は、副問合せ 内のempnoによって行が順序付けられた後で生成されます。
比較条件「ROWNUM値>正の整数」は、常に偽となるため注意してください。たとえば、次 の問合せでは行は戻されません。
SELECT * FROM emp WHERE ROWNUM > 1;
最初にフェッチされる行のROWNUMには1が割り当てられるため、条件は偽と判断されま す。2番目にフェッチされる予定であった行は最初の行になるため、このROWNUMにも1が 割り当てられ、条件も偽と判断されます。このように、後続するすべての行が条件を満たさ ないため、行は戻されません。
また、次の例のように、ROWNUMを使用して表の各行に一意の値を割り当てることもできま す。
UPDATE tabx
SET col1 = ROWNUM;
参照参照参照
参照: top-N queryの詳細は、『Oracle8iアプリケーション開発者ガイド
基礎編』を参照してください。
注意注意注意
注意: 問合せでROWNUMを使用した場合、ビューの最適化に影響するこ とがあります。詳細は、『Oracle8i概要』を参照してください。
コメント コメント コメント コメント
SQL文とスキーマ・オブジェクトに対してコメントを付けることができます。
SQL 文中のコメント 文中のコメント 文中のコメント 文中のコメント
SQL文中のコメントは、文の実行には影響しませんが、アプリケーションを読みやすく、メ ンテナンスしやすくできます。文にはアプリケーションでのその文の目的を記述したコメン トを含めることができます。
コメントは、文中のキーワード、パラメータまたは句読点の間に入れることができます。次 のどちらかの方法を使用します。
■ スラッシュとアスタリスク(/*)を使用してコメントを開始します。コメントのテキス トを続けます。このテキストは複数行に及んでもかまいません。アスタリスクとスラッ シュ(*/)を使用してコメントを終了します。開始文字と終了文字は、空白や改行に よってテキストから切り離す必要はありません。
■ --(ハイフン2個)を使用してコメントを開始します。コメントのテキストを続けます。
このテキストは複数行にまたがることはできません。改行によってコメントを終了しま す。
SQL文の中に両方のスタイルのコメントが複数あってもかまいません。コメントのテキスト には、使用しているデータベース・キャラクタ・セットの印字可能文字を含めることができ ます。
例例例
例 次の文には多くのコメントが含まれています。
SELECT ename, sal + NVL(comm, 0), job, loc /* Select all employees whose compensation is greater than that of Jones.*/
FROM emp, dept
/*The DEPT table is used to get the department name.*/
WHERE emp.deptno = dept.deptno
AND sal + NVL(comm,0) > /* Subquery: */
(SELECT sal + NLV(comm,0)
/* total compensation is sal + comm */
FROM emp
WHERE ename = 'JONES');
注意 注意注意
注意: SQLスクリプト内のSQL文では、このようなスタイルのコメント を使用できません。この場合、SQL*PlusのREMARKコマンドを使用して ください。これらの文の詳細は、『Oracle8i SQL*Plusユーザーズ・ガイド およびリファレンス』を参照してください。
SELECT ename, -- select the name sal + NVL(comm, 0), -- total compensation job, -- job
loc -- and city containing the office FROM emp, -- of all employees
dept
WHERE emp.deptno = dept.deptno
AND sal + NVL(comm, 0) > -- whose compensation -- is greater than (SELECT sal + NVL(comm,0) -- the compensation FROM emp
WHERE ename = 'JONES'); -- of Jones.
スキーマ・オブジェクトに関するコメント スキーマ・オブジェクトに関するコメント スキーマ・オブジェクトに関するコメント スキーマ・オブジェクトに関するコメント
COMMENTコマンドを使用して、表、ビュー、マテリアライズド・ビューまたは列にコメン トを付けることができます。スキーマ・オブジェクトに付けたコメントは、データ・ディク ショナリに格納されます。
ヒント ヒント ヒント ヒント
Oracleオプティマイザに指示(ヒント)を与えるために、SQL文中でコメントを使用できま
す。オプティマイザは、これらのヒントを提案として使用し、文の実行計画を選択します。
文ブロックには、ヒントを含むコメントは1つのみ指定できます。このコメントは、
SELECT、UPDATE、INSERTまたはDELETEのいずれかのキーワードの後でのみ指定できま す。次の構文は、Oracleが文ブロック内でサポートする両方のスタイルのコメントに含まれ るヒントの構文です。
{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
または
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...
参照 参照参照
参照: コメントについては、8-129ページの「COMMENT」を参照して ください。
ここで、それぞれの意味は次のとおりです。
■ DELETE、INSERT、SELECTまたはUPDATEは、文ブロックを始めるDELETE、
INSERT、SELECTまたはUPDATEのいずれかのキーワードです。ヒントを含むコメン トは、これらのキーワードの後でのみ指定できます。
■ +(プラス記号)は、コメントをヒントのリストとして、Oracleに解析させます。プラ
ス記号は、コメント・デリミタの直後に置く必要があります(空白を入れてはいけませ ん)。
■ hintは、この項で説明するヒントの1つです。プラス記号とヒントの間の空白は入れて も入れなくてもかまいません。コメントに複数のヒントが含まれている場合は、1つ以 上の空白で区切る必要があります。
■ textは、ヒントに含めることができるその他のコメント・テキストです。
次に、各ヒントの構文および説明を示します。ヒントは、機能のカテゴリに分類して説明し ています。
最適化方法と目標のヒント 最適化方法と目標のヒント 最適化方法と目標のヒント 最適化方法と目標のヒント
ALL_ROWSヒントによって、最高のスループットを実現する(リソース使用の合計を最小限 にする)という目的で文ブロックを最適化するために、コストベース方法を明示的に選択し ます。
CHOOSEヒントによって、各SQL文について、ルールベース方法とコストベース方法のいず れかをオプティマイザが選択します。どちらを選択するかは、この文による表アクセスの統 計情報を利用します。
参照参照参照
参照: ヒントの詳細は、『Oracle8iパフォーマンスのための設計および チューニング』および『Oracle8i概要』を参照してください。
/*+ ALL_ROWS */
/*+ CHOOSE */
FIRST_ROWSヒントによって、最適の応答時間を実現する(最初の行を戻すために使用する リソースを最小限にする)という目的で文ブロックを最適化するために、コストベース方法 を明示的に選択します。
このヒントによって、オプティマイザは次のように選択できます。
■ 索引スキャンが使用可能な場合、フル・テーブル・スキャンを選択します。
■ 索引スキャンが使用可能な場合、対応する表がネステッド・ループの内部表であれば、
ソート/マージ結合に対して、ネステッド・ループ・ジョインを選択します。
■ 索引スキャンがORDERBY句によって使用可能な場合、ソート操作を回避します。
RULEヒントによって、文ブロックのために、ルールベース最適化を明示的に選択します。
これによって、文ブロックに指定されている別のヒントは無視されます。
アクセス方法のヒント アクセス方法のヒント アクセス方法のヒント アクセス方法のヒント
AND_EQUALヒントによって、複数の単一列索引のスキャン結果をマージするアクセス・パ スを使用する実行計画を明示的に選択します。
CLUSTERヒントによって、指定された表にアクセスするために、クラスタ・スキャンを明 示的に選択します。このヒントは、クラスタ化されているオブジェクトでのみ適用されま す。
FULLヒントによって、指定された表に対するフル・テーブル・スキャンを明示的に選択し /*+ FIRST_ROWS */
/*+ RULE */
/*+ AND_EQUAL ( table index index
index index index
) */
/*+ CLUSTER ( table ) */
/*+ FULL ( table ) */
HASHヒントによって、指定された表にアクセスするために、ハッシュ・スキャンを明示的 に選択します。このヒントは、クラスタに格納されている表のみで適用されます。
INDEXヒントによって、指定された表に対する索引スキャンを明示的に選択します。INDEX ヒントは、ドメイン、B*ツリーおよびビットマップ索引に対して使用できます。ただし、
ビットマップ索引に対しては、INDEXヒントではなく、適応性の高いINDEX_COMBINEヒ ントを使用することをお薦めします。
INDEX_ASCヒントによって、指定された表に対する索引スキャンを明示的に選択します。
文が索引レンジ・スキャンを使用する場合、索引付けされた値の昇順に索引エントリをス キャンします。
INDEX_COMBINEヒントによって、表に対するビットマップ・アクセス・パスを明示的に選 択します。索引がINDEX_COMBINEヒントの引数として指定されていない場合は、表にアク セスするための推定コストが最適であるビットマップ索引の組合せをオプティマイザが使用 します。特定の索引が引数として指定されている場合、オプティマイザは、指定されたビッ トマップ索引の組合せを次々に試します。
INDEX_DESCヒントによって、指定された表に対する索引スキャンを明示的に選択します。
文が索引レンジ・スキャンを使用する場合、索引付けされた値の降順に索引エントリをス キャンします。パーティション索引では、結果はパーティションごとに降順に戻されます。
/*+ HASH ( table ) */
/*+ INDEX ( table
index
) */
/*+ INDEX_ASC ( table
index
) */
/*+ INDEX_COMBINE ( table
index
) */
/*+ INDEX_DESC ( table
index
) */