Oracle中怎么使用NESTEDLOOP操作

本篇內(nèi)容主要講解“Oracle中怎么使用NESTED LOOP操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Oracle中怎么使用NESTED LOOP操作”吧!

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網(wǎng)站、網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的大觀網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

通過例子說明分頁查詢使用的NESTED LOOP操作,在分頁查詢翻到最后幾頁時的性能問題:

SQL> CREATE TABLE T AS SELECT * FROM DBA_USERS;

表已創(chuàng)建。

SQL> CREATE TABLE T1 AS SELECT * FROM DBA_SOURCE;

表已創(chuàng)建。

SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (USERNAME);

表已更改。

SQL> ALTER TABLE T1 ADD CONSTRAINT FK_T1_OWNER FOREIGN KEY (OWNER)
 2  REFERENCES T(USERNAME);

表已更改。

SQL> CREATE INDEX IND_T1_OWNER ON T1(NAME);

索引已創(chuàng)建。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')

PL/SQL 過程已成功完成。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T1')

PL/SQL 過程已成功完成。

SQL> SELECT /*+ FIRST_ROWS */ USER_ID, USERNAME, NAME
 2  FROM
 3   (
 4    SELECT ROWNUM RN, USER_ID, USERNAME, NAME
 5    FROM
 6     (
 7      SELECT T.USER_ID, T.USERNAME, T1.NAME
 8      FROM T, T1
 9      WHERE T.USERNAME = T1.OWNER
10     )
11    WHERE ROWNUM <= 20
12   )
13  WHERE RN >= 11;

已選擇10行。


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=97811 Card=20 Bytes=1200)
  1    0   VIEW (Cost=97811 Card=20 Bytes=1200)
  2    1     COUNT (STOPKEY)
  3    2       NESTED LOOPS (Cost=97811 Card=96985 Bytes=2909550)
  4    3         TABLE ACCESS (FULL) OF 'T1' (Cost=826 Card=96985 Bytes=1842715)
  5    3         TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=1 Card=1 Bytes=11)
  6    5           INDEX (UNIQUE SCAN) OF 'PK_T' (UNIQUE)


Statistics
----------------------------------------------------------
         0  recursive calls
         0  db block gets
        28  consistent gets
         0  physical reads
         0  redo size
       574  bytes sent via SQL*Net to client
       503  bytes received via SQL*Net from client
         2  SQL*Net roundtrips to/from client
         0  sorts (memory)
         0  sorts (disk)
        10  rows processed

SQL> SELECT  USER_ID, USERNAME, NAME
 2  FROM
 3   (
 4    SELECT ROWNUM RN, USER_ID, USERNAME, NAME
 5    FROM
 6     (
 7      SELECT T.USER_ID, T.USERNAME, T1.NAME
 8      FROM T, T1
 9      WHERE T.USERNAME = T1.OWNER
10     )
11   )
12  WHERE RN BETWEEN 11 AND 20;

已選擇10行。


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE (Cost=830 Card=96985 Bytes=5819100)
  1    0   VIEW (Cost=830 Card=96985 Bytes=5819100)
  2    1     COUNT
  3    2       HASH JOIN (Cost=830 Card=96985 Bytes=2909550)
  4    3         TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=12 Bytes=132)
  5    3         TABLE ACCESS (FULL) OF 'T1' (Cost=826 Card=96985 Bytes=1842715)


Statistics
----------------------------------------------------------
         0  recursive calls
         0  db block gets
      8586  consistent gets
      8052  physical reads
         0  redo size
       574  bytes sent via SQL*Net to client
       503  bytes received via SQL*Net from client
         2  SQL*Net roundtrips to/from client
         0  sorts (memory)
         0  sorts (disk)
        10  rows processed

在分頁查詢的前幾頁,NESTED LOOP操作比HASH JOIN操作效率高得多。

SQL> SET AUTOT OFF
SQL> SELECT COUNT(*) FROM T, T1 WHERE USERNAME = OWNER;

 COUNT(*)
----------
    96985

SQL> SET AUTOT TRACE

SQL> SELECT  USER_ID, USERNAME, NAME
 2  FROM
 3   (
 4    SELECT ROWNUM RN, USER_ID, USERNAME, NAME
 5    FROM
 6     (
 7      SELECT T.USER_ID, T.USERNAME, T1.NAME
 8      FROM T, T1
 9      WHERE T.USERNAME = T1.OWNER
10     )
11   )
12  WHERE RN BETWEEN 96971 AND 96980;

已選擇10行。


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE (Cost=830 Card=96985 Bytes=5819100)
  1    0   VIEW (Cost=830 Card=96985 Bytes=5819100)
  2    1     COUNT
  3    2       HASH JOIN (Cost=830 Card=96985 Bytes=2909550)
  4    3         TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=12 Bytes=132)
  5    3         TABLE ACCESS (FULL) OF 'T1' (Cost=826 Card=96985 Bytes=1842715)


Statistics
----------------------------------------------------------
         0  recursive calls
         0  db block gets
      8586  consistent gets
      8068  physical reads
         0  redo size
       571  bytes sent via SQL*Net to client
       503  bytes received via SQL*Net from client
         2  SQL*Net roundtrips to/from client
         0  sorts (memory)
         0  sorts (disk)
        10  rows processed

對于最后幾頁,采用HASH JOIN的方式,執(zhí)行效率幾乎沒有任何改變,而采用NESTED LOOP方式,則效率嚴重下降,而且遠遠低于HASH JOIN的方式。

SQL> SELECT /*+ FIRST_ROWS */ USER_ID, USERNAME, NAME
 2  FROM
 3   (
 4    SELECT ROWNUM RN, USER_ID, USERNAME, NAME
 5    FROM
 6     (
 7      SELECT T.USER_ID, T.USERNAME, T1.NAME
 8      FROM T, T1
 9      WHERE T.USERNAME = T1.OWNER
10     )
11    WHERE ROWNUM <= 96980
12   )
13  WHERE RN >= 96971;

已選擇10行。


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=97811 Card=96980 Bytes=5818800)
  1    0   VIEW (Cost=97811 Card=96980 Bytes=5818800)
  2    1     COUNT (STOPKEY)
  3    2       NESTED LOOPS (Cost=97811 Card=96985 Bytes=2909550)
  4    3         TABLE ACCESS (FULL) OF 'T1' (Cost=826 Card=96985 Bytes=1842715)
  5    3         TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=1 Card=1 Bytes=11)
  6    5           INDEX (UNIQUE SCAN) OF 'PK_T' (UNIQUE)


Statistics
----------------------------------------------------------
         0  recursive calls
         0  db block gets
    105566  consistent gets
      8068  physical reads
         0  redo size
       571  bytes sent via SQL*Net to client
       503  bytes received via SQL*Net from client
         2  SQL*Net roundtrips to/from client
         0  sorts (memory)
         0  sorts (disk)
        10  rows processed

分頁查詢一般情況下,很少會翻到最后一篇,如果只是偶爾碰到這種情況,對系統(tǒng)性能不會有很大的影響,但是如果經(jīng)常碰到這種情況,在設計分頁查詢時應該給予足夠的考慮。

到此,相信大家對“Oracle中怎么使用NESTED LOOP操作”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

網(wǎng)頁名稱:Oracle中怎么使用NESTEDLOOP操作
網(wǎng)頁地址:http://muchs.cn/article2/ihsgic.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、企業(yè)網(wǎng)站制作、關鍵詞優(yōu)化ChatGPT、網(wǎng)站收錄、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司