在前面的V$TEMPSEG_USAGE与Oracle排序中我谈到V$TEMPSEG_USAGE和V$SORT_USAGE同源其中的SEGFILE#代表的是绝对文件号(AFN) 那么对于临时表空间的临时文件来说这个字段可以和什么字段进行关联呢? 我们再来看一下V$TEMPFILE的来源V$TEMPFILE由如下语句创建: SELECT tfinst_id tftfnum TO_NUMBER (tftfcrc_scn) TO_DATE (tftfcrc_tim MM/DD/RR HH:MI:SS NLS_CALENDAR=Gregorian) tftftsn tftfrfn DECODE (BITAND (tftfsta ) OFFLINE ONLINE UNKNOWN) DECODE (BITAND (tftfsta ) DISABLED READ ONLY READ WRITE UNKNOWN ) fhfhtmpfsz * tftfbsz fhfhtmpfsz tftfcsz * tftfbsz tftfbsz fnfnnam FROM x$kcctf tf x$kccfn fn x$kcvfhtmp fh WHERE fnfnfno = tftfnum AND fnfnfno = pxfil AND tftffnh = fnfnnum AND tftfdup != AND fnfntyp = AND fnfnnam IS NOT NULL 考察x$kcctf底层表我们注意到TFAFN(temp file absolute file number)在这里存在: SQL> desc x$kcctf Name Null? Type ADDR RAW() INDX NUMBER INST_ID NUMBER TFNUM NUMBER TFAFN NUMBERTFCSZ NUMBER TFBSZ NUMBER TFSTA NUMBER TFCRC_SCN VARCHAR() TFCRC_TIM VARCHAR() TFFNH NUMBER TFFNT NUMBER TFDUP NUMBER TFTSN NUMBER TFTSI NUMBER TFRFN NUMBER TFPFT NUMBER 而这个字段在构建v$tempfile时并未出现所以我们不能通过v$sort_usage和v$tempfile直接关联绝对文件号 通过LOB对象与临时段一文中方法我们可以简单构建一个排序段使用然后来研究一下: SQL> select usernamesegtypesegfile#segblk#extentssegrfno# from v$sort_usage; USERNAME SEGTYPE SEGFILE# SEGBLK# EXTENTS SEGRFNO# SYS LOB_DATA 我们看到这里的SEGFILE#=而在v$tempfile是找不到这个信息的: SQL> select file#rfile#ts#statusblocks from v$tempfile; FILE# RFILE# TS# STATUS BLOCKS ONLINE 我们可以从x$kcctf中获得这些信息我们可以看到v$tempfilefile#实际上来自x$kcctftfnum实际上是临时文件的顺序号而绝对文件号是x$kcctftfafn这个才可以和v$sort_usagesegfile#关联 SQL> select indxtfnumtfafntfcsz from x$kcctf; INDX TFNUM TFAFN TFCSZ 临时表空间的绝对文件号可以通过如下查询获得: SQL> select tmfile# Fnum tftfafn AFNtmname FName from v$tempfile tmx$kcctf tf where tmfile# = tftfnum; FNUM AFN FNAME /opt/oracle/oradata/conner/tempdbf /opt/oracle/oradata/conner/tempdbf 至于其他就不再赘述 |