Oracleのページングクエリとデータ重複排除の深い理解

ページングクエリ

高効率の言葉遣い

**
1.文言のソートBYないORDER。(最大効率)は、
 (テストの後、この方法は最も低コスト、ネスティングの一層のみで、クエリが大きく、ほとんど影響を受けず、スピードがまだある場合でも!データの最速!額)
SELECT *

  FROM(ROWNO、T AS ROWNUMを選択します。*

          EMP Tから

        TO_DATE( '20060501'、 'YYYYMMDD')BETWEEN WHERE入社年月日

                            AND TO_DATE( '20060731'、 'YYYYMMDD')

          AND ROWNUM <= 20)テーブルエイリアス

 WHERE table_alias.rowno> = 10。


文言のソートBY 2. ORDER。(高効率)
 (お問い合わせの範囲の拡大と、このメソッドをテストしたが、速度がああより遅くなります!)
SELECT *を

  FROM(TTを選択します。*、ROWNUM ROWNO AS

          FROM(トンを選択します。*

                    EMP Tから

                  TO_DATE( '20060501'、 'YYYYMMDD')BETWEEN WHERE入社年月日

                                      AND TO_DATE( '20060731'、 'YYYYMMDD')

                CREATE_TIMEのDESC、EMP_NO)TT BY ORDER

        WHERE ROWNUM <= 20)テーブルエイリアス

 WHERE table_alias.rowno> = 10。


**

第二に、ごみの効率は、それは非常に一般的なページング文言です

**

3.文言のソートBYないORDER。(代わりに推奨される方法の1)
 (データクエリの量の拡大に伴い、この方法は、ああ遅くすることができます!)
SELECT *

  FROM(ROWNO、T AS ROWNUMを選択します。*

          k_task Tから

        TO_DATE( '20060501'、 'YYYYMMDD')BETWEEN WHERE FLIGHT_DATE

                              AND TO_DATE( '20060731'、 'YYYYMMDD'))テーブルエイリアス

 WHERE table_alias.rowno <= 20 AND table_alias.rowno> = 10。

10と100の間--TABLE_ALIAS.ROWNO。

4.文言のソートBY ORDERがある。(代わりに推奨される方法の2)が
 (この方法は、問い合わせの範囲の拡大に伴い、速度がああ遅くなります!)
SELECT *

  FROM(TTを選択します。*、ROWNUM ROWNO AS

          FROM(SELECT *

                    k_task Tから

                  TO_DATE( '20060501'、 'YYYYMMDD')BETWEEN WHERE FLIGHT_DATE

                                        AND TO_DATE( '20060531'、 'YYYYMMDD')

                fact_up_time、flight_no)TT)テーブルエイリアスBY ORDER

 WHERE 10〜20 table_alias.rowno。

5.別の構文。(文言BYありORDER)
伝統的なSQL構文の文法とスタイルが異なっている、読んで理解し、標準化と標準統一するために便利ではない、推奨されません。)
partdata WITH AS

    (

        ROWNO、TT AS ROWNUMを選択します。*

          FROM(SELECT *

                    k_task Tから

                  TO_DATE( '20060501'、 'YYYYMMDD')BETWEEN WHERE FLIGHT_DATE

                                        AND TO_DATE( '20060531'、 'YYYYMMDD')

                fact_up_time、flight_no BY ORDER)TT

        WHERE ROWNUM <= 20)

SELECT *

  partdata FROM

 WHERE ROWNO> = 10。

 

--6代替構文。(文言BYませORDERありません)

AS partdata WITH

    (

        ROWNO、TとROWNUMを選択します。*

          k_task Tから

        TO_DATE( '20060501'、 'YYYYMMDD')BETWEEN WHERE FLIGHT_DATE

                              AND TO_DATE( '20060531'、 'YYYYMMDD')

          AND ROWNUM <= 20)

SELECT *

  partdata FROM

 WHERE ROWNO> = 10。

**

第三に、分析

**
オラクルページングクエリは、基本的には本明細書に記載されたフォーマットに応じて適用することができます。

ページングクエリ形式:
SELECT *

  FROM(SELECT *、ROWNUM RN

          FROM(SELECT *

                  TABLE_NAME FROM)A

        WHERE ROWNUM <= 40)

 WHERE RN> = 21

TABLE_NAME FROM SELECT最も内側のクエリ*の一つは、ページをめくることなく、元のクエリを表します。ROWNUM <= 40とRN> =制御範囲クエリ21ページあたり。

このページでは、ほとんどの場合、より高効率で、クエリの上に与えられました。目的は、ページネーションの結果セットのサイズの出力を制御することで、結果はできるだけ早く返されます。上記のクエリページングでは、この考察は、主にWHERE ROWNUM <= 40文に反映されます。

40個の二つの方法の選択記録21の存在は、一方が上記に示した例では第二層ROWNUM <= 40であり、制御最大値にクエリ、クエリ内のコントロールの最外層の最小値。他の方法は、ROWNUM <= 40ステートメント、最小および最大制御がクエリのタブを最も外側のクエリの第二の層を除去することです。これは以下のようにクエリです:
SELECT *

  FROM(SELECT *、ROWNUM RN

          FROM(SELECT *

                  )TABLE_NAME FROM A)

 21〜40 RnはWHERE

書かれた2つのケースの大半を比較する、最初のクエリの効率は、第二のよりもはるかに高いです。

これはCBO最適化モードは、オラクルクエリは外側のクエリの内側層にプッシュすることができるので、クエリは内側層の効率を改善することです。最初のクエリ、ROWNUM <= 40は、内側問合せオラクル、結果が返されるクエリの終了時に何度もこのようなクエリのOracle ROWNUM制限の結果に押し込むことができる第2の照会層。

21と40との間のクエリは、クエリの第三層、クエリおよびOracleに存在するので、2番目のクエリは、最も内側に押されても、最も内側の層(第三層にプッシュされない意味がない、なぜならほとんどは何RNの代わりに内側のクエリ)を知りません。したがって、2番目のクエリのために、Oracleは、最も内側の中間層のすべてのデータのための条件を満たし、且つ中間層へ戻り、全てのデータの最外層であるに戻ります。最外層のデータが完成されたフィルタは、効率が最初のクエリよりもはるかに低いことが明らかです。

上記の分析は、単純な単一テーブルのクエリのための最も内側のクエリのために効果的ではない複雑なマルチテーブル、クエリを結合したり、最も内側のクエリがソートが含まれています。

ここでは、クエリは、説明の並べ替え、実施例により詳細に説明する次の記事が含まれていません。

以下は、マルチテーブルの結合の状況について簡単な議論です。

最も一般的な同等のテーブルがクエリに参加するために、CBOは、一般的に(一般的にCBOを考慮しないであろう、HASH効率をJOINをより効率的にマージ結合)に参加2つの接続ネストされたループとHASHを使用することができます。ここで、タブので、レコードのように指定された最大数が返され、ネストされたループは、レコードの最大数よりも多くが直ちに停止し、中間層に結果を返し、HASH JOINは、すべての結果セットを解決しなければならない戻すことができる(MERGE登録しよう)です。クエリの接続方法は、例のページングクエリの大半は、クエリデータの最初の数ページ、裏ページへのアクセスのより多くのチャンスがあるとき(より効率的であるように、ほとんどの場合、ページングクエリのネストされたループを選択)より小さい。

あなたがシステムにヒントを使用して気にしない場合したがって、それは、クエリー・リライトをページングすることができます:
SELECT *

  FROM(SELECT *、ROWNUM RN

          FROM(SELECT *

                  TABLE_NAME FROM)A

        WHERE ROWNUM <= 40)

 WHERE RN> = 21

Oracleのデータ重複除外

完全な重複データ重複排除方法

  具体的なアイデアは、最初の一時テーブルを作成し、この一時テーブルにDISTINCTの後にテーブルデータを挿入することで、元のテーブルのデータを空にし、データが元のテーブルに一時テーブルを再訪挿入し、最後に一時テーブルを削除します。

  テーブルのデータ重複排除の正確な複製については、次のSQLステートメントを使用することができます。

      - コード

    (表FROM SELECTDISTINCTの*)AS TABLE "#TEMP" を作成; - 一時テーブルを作成し、データ重複DISTINCT一時テーブルに挿入

    TABLEテーブル名を切り捨てる; - 元のテーブルのデータを空にする

    テーブル名( "#TEMP" SELECT * FROM)。INSERT INTO; - 一時テーブルのデータを元のテーブルに

    DROP TABLEの "#TEMPは"; - 一時テーブルを削除します

部分的なデータ重複排除の第二に、方法

私たちは、一時テーブルの設立を検討することができ、比較を行うときに、削除、一時テーブルに挿入されたROWID、重複したフィールドを決定する必要があります。

CreateTable一時テーブルAS
 
フィールド1、GROUPBYフォーマルテーブルフィールド1、フィールド2からフィールド2、MAX(a.ROWID)データIDを選択します。....
 
deletefromテーブルA
 
WHERE a.rowid =!
 

 
Bを選択一時表Bから.dataid
 
..フィールド1 = b及びフィールド1
 
...フィールドのフィールド2 = B 2
 
);
 
コミット。

例:

- MAX(a.rowid)重複データをフィルタ処理は、データが一時テーブルを取得するために繰返さない
テーブル一時テーブルとして作成
ipresultからSELECT a.ip、a.port、MAX(a.ROWID)データIDを
GROUP BY A .IP、a.port。

-データの唯一の最新作品を維持し、正式なテーブルの重複データを削除して
から削除ipresultのA
!WHERE a.rowid =

B、一時テーブルからSELECT b.dataid
WHERE a.ip = b.ipと
a.port = b.port
);

-一時的なフォームを削除し、提出し
、ドロップテーブル、一時テーブルを、
コミット;

おすすめ

転載: www.linuxidc.com/Linux/2019-07/159490.htm