日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle视图查询数据慢,8i查询DBA_FREE_SPACE视图极慢的问题

發布時間:2023/12/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle视图查询数据慢,8i查询DBA_FREE_SPACE视图极慢的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

還是那套古老的8.1.7.4,在該系統上檢查表空間使用情況的SQL運行緩慢,其SQL如下:

SELECT D.TABLESPACE_NAME,

SPACE "SUM_SPACE(M)",

SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",

ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",

FREE_SPACE "FREE_SPACE(M)"

FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE

FROM DBA_DATA_FILES

GROUP BY TABLESPACE_NAME) D,

(SELECT TABLESPACE_NAME,

ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE

FROM DBA_FREE_SPACE

GROUP BY TABLESPACE_NAME) F

where d.tablespace_name = f.tablespace_name(+)

order by "USED_RATE(%)" desc;

/*很面熟的DBA常用腳本吧?*/

經確認其中對DBA_FREE_SPACE視圖的查詢耗費了大量時間,8i中該視圖的默認定義是:

select ts.name,

fi.file#,

f.block#,

f.length * ts.blocksize,

f.length,

f.file#

from sys.ts$ ts, sys.fet$ f, sys.file$ fi

where ts.ts# = f.ts#

and f.ts# = fi.ts#

and f.file# = fi.relfile#

and ts.bitmapped = 0

/*以上查詢DMT表空間上的FREE EXTENT*/

union all

/*以下查詢LMT表空間上的FREE EXTENT*/

select /*+ ordered use_nl(f) use_nl(fi) */

ts.name,

fi.file#,

f.ktfbfebno,

f.ktfbfeblks * ts.blocksize,

f.ktfbfeblks,

f.ktfbfefno

from sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fi

where ts.ts# = f.ktfbfetsn

and f.ktfbfetsn = fi.ts#

and f.ktfbfefno = fi.relfile#

and ts.bitmapped <> 0

and ts.online$ in (1, 4)

and ts.contents$ = 0

/*也許你感到奇怪,實際上8i中就有了本地管理模式的表空間了,只是很少有人用。("In Oracle 8i the EXTENT MANAGEMENT clause was introduced into the CREATE TABLESPACE statement allowing extent management to be LOCAL or DICTIONARY. Locally Manages Tablespaces (LMT) have a bitmap of the blocks, or groups of blocks, they contain allowing them to track extent allocation without reference to the data dictionary.")*/

/*因字典管理模式下FET$基表往往較大,導致UNION ALL以上部分在連接操作時會產生大量的邏輯讀,最終導致了對DBA_FREE_SPACE視圖的查詢十分緩慢。*/

Oracle 提供了官方的視圖并不意味著我們非它不可用,可以通過修改DBA_FREE_SPACE的定義,或另建一個具有相同功能但查詢SQL構造不同的視圖來加快查詢速度:

explain plan for

select /*+use_hash (tsfi, fet2 ) */

tsfi.tablespace_name,

tsfi.file_id,

fet2.block_id,

tsfi.blocksize * fet2.blocks,

fet2.blocks,

tsfi.relfile#

from (select /*+ use_hash ( ts, fi ) */

ts.name tablespace_name,

fi.file# file_id,

ts.BLOCKSIZE,

fi.relfile#,

ts.ts#

from sys.ts$ ts, sys.file$ fi

where ts.ts# = fi.ts#

and ts.online$ in (1, 4)) tsfi,

(select f.block# block_id, f.length blocks, f.file# file_id, f.ts#

from sys.fet$ f

union all

select f.ktfbfebno block_id,

f.ktfbfeblks blocks,

f.ktfbfefno,

ktfbfetsn

from sys.x$ktfbfe f) fet2

where fet2.file_id = tsfi.relfile#

and fet2.ts# = tsfi.ts# /*此查詢需SYSDBA權限*/ ;

Explained

select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------------

Plan hash value: 717737944

---------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

---------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 20 | 1560 | 9 (12)| 00:00:01 |

|* 1 | HASH JOIN | | 20 | 1560 | 9 (12)| 00:00:01 |

|* 2 | HASH JOIN | | 4 | 104 | 6 (17)| 00:00:01 |

| 3 | TABLE ACCESS FULL | FILE$ | 4 | 36 | 2 (0)| 00:00:01 |

|* 4 | TABLE ACCESS FULL | TS$ | 5 | 85 | 3 (0)| 00:00:01 |

| 5 | VIEW | | 101 | 5252 | 3 (0)| 00:00:01 |

| 6 | UNION-ALL | | | | | |

| 7 | TABLE ACCESS FULL| FET$ | 1 | 52 | 3 (0)| 00:00:01 |

| 8 | FIXED TABLE FULL | X$KTFBFE | 100 | 5200 | 0 (0)| 00:00:01 |

---------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("FET2"."FILE_ID"="FI"."RELFILE#" AND

"FET2"."TS#"="TS"."TS#")

2 - access("TS"."TS#"="FI"."TS#")

4 - filter("TS"."ONLINE$"=1 OR "TS"."ONLINE$"=4)

/*改寫后可以大幅減少邏輯讀從而提高性能*/

/*可以建立DBA_FREE_SPACE功能相同的替代品,并代入到表空間使用率的腳本中*/

CREATE OR REPLACE VIEW DBA_FREE_SPACE_NEW (

TABLESPACE_NAME,

FILE_ID,

BLOCK_ID,

BYTES,

BLOCKS,

RELATIVE_FNO

) AS

select /*+use_hash (tsfi, fet2 ) */

tsfi.tablespace_name,

tsfi.file_id,

fet2.block_id,

tsfi.blocksize * fet2.blocks,

fet2.blocks,

tsfi.relfile#

from (select /*+ use_hash ( ts, fi ) */

ts.name tablespace_name,

fi.file# file_id,

ts.BLOCKSIZE,

fi.relfile#,

ts.ts#

from sys.ts$ ts, sys.file$ fi

where ts.ts# = fi.ts#

and ts.online$ in (1, 4)) tsfi,

(select f.block# block_id, f.length blocks, f.file# file_id, f.ts#

from sys.fet$ f

union all

select f.ktfbfebno block_id,

f.ktfbfeblks blocks,

f.ktfbfefno,

ktfbfetsn

from sys.x$ktfbfe f) fet2

where fet2.file_id = tsfi.relfile#

and fet2.ts# = tsfi.ts# /*建此視圖需SYSDBA權限*/ ;

總結

以上是生活随笔為你收集整理的oracle视图查询数据慢,8i查询DBA_FREE_SPACE视图极慢的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。