關於Doc ID 317441.1提供的檢視當前使用臨時表空間的SQL存在的問題
阿新 • • 發佈:2020-10-29
關於Doc ID 317441.1提供的檢視當前使用臨時表空間的SQL存在的問題
How Do You Find Who And What SQL Is Using Temp Segments (Doc ID 317441.1)
對於10.1以上的版本,該文件提供如下SQL查詢,稍微改造了下。
SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks*8/1024 use_temp_mb, c.sql_text FROM v$session a, v$tempseg_usage b, v$sqlarea c WHEREa.saddr = b.session_addr AND c.address= a.sql_address AND c.hash_value = a.sql_hash_value ORDER BY b.tablespace, b.blocks;
但實際上使用如下語句查詢後,存在一些其他會話也在使用temp空間。
set line 300 col username for a25 col tablespace for a10 col sql_id for a13 col prev_sql_id for a13 col SEGTYPE for a10 col contents for a10View Codeselect s.sid, s.serial#, s.username, s.sql_id, s.prev_sql_id, --u.sql_id, u.tablespace, u.contents, u.segtype, u.extents, u.blocks, round(((u.blocks * P.VALUE) / 1024 / 1024), 2) MB from v$session s, v$sort_usage u, SYS.V_$SYSTEM_PARAMETER P where s.saddr = u.session_addr AND UPPER(P.NAME) = 'DB_BLOCK_SIZE' order by MB DESC;
14:38:42 SYS@test2(2217)> set line 300 14:45:17 SYS@test2(2217)> col username for a25 14:45:17 SYS@test2(2217)> col tablespace for a10 14:45:17 SYS@test2(2217)> col sql_id for a13 14:45:17 SYS@test2(2217)> col prev_sql_id for a13 14:45:17 SYS@test2(2217)> col SEGTYPE for a10 14:45:17 SYS@test2(2217)> col contents for a10 14:45:17 SYS@test2(2217)> select s.sid, 14:45:18 2 s.serial#, 14:45:18 3 s.username, 14:45:18 4 s.sql_id, 14:45:18 5 s.prev_sql_id, 14:45:18 6 --u.sql_id, 14:45:18 7 u.tablespace, 14:45:18 8 u.contents, 14:45:18 9 u.segtype, 14:45:18 10 u.extents, 14:45:18 11 u.blocks, 14:45:18 12 round(((u.blocks * P.VALUE) / 1024 / 1024), 2) MB 14:45:18 13 from v$session s, v$sort_usage u, SYS.V_$SYSTEM_PARAMETER P 14:45:18 14 where s.saddr = u.session_addr 14:45:18 15 AND UPPER(P.NAME) = 'DB_BLOCK_SIZE' 14:45:18 16 order by MB DESC; SID SERIAL# USERNAME SQL_ID PREV_SQL_ID TABLESPACE CONTENTS SEGTYPE EXTENTS BLOCKS MB ---------- ---------- ------------------------- ------------- ------------- ---------- ---------- ---------- ---------- ---------- ---------- 1374 3955 XXXXXXX_XXXX 38mq996b6vyf9 TEMP TEMPORARY LOB_DATA 6777 867456 6777 1308 1925 XXXXXXX_XXXX 4s5t8xn6xtksd 4s5t8xn6xtksd TEMP TEMPORARY LOB_DATA 1272 162816 1272 1374 3955 XXXXXXX_XXXX 38mq996b6vyf9 TEMP TEMPORARY LOB_INDEX 261 33408 261 1308 1925 XXXXXXX_XXXX 4s5t8xn6xtksd 4s5t8xn6xtksd TEMP TEMPORARY LOB_INDEX 92 11776 92 2213 40587 XXXXXXX gcshr3q6xnhu6 TEMP TEMPORARY LOB_DATA 2 256 2 2039 60903 XXXXXXX_XXX 4d3s1h918g6kn TEMP TEMPORARY LOB_DATA 2 256 2 995 2333 XXXXXXX_XXX 4d3s1h918g6kn TEMP TEMPORARY LOB_DATA 2 256 2 998 2205 XXXXXXX_XXXXXXXX f7rwpfmt8qbds TEMP TEMPORARY LOB_DATA 1 128 1 879 42597 XXXXXXX_XX 75p9dz19bafvz TEMP TEMPORARY LOB_DATA 1 128 1 1256 2839 XXXXXXX_XXXX cvy6vzrh3m9ug TEMP TEMPORARY LOB_DATA 1 128 1 843 15 DBSNMP 520mkxqpf15q8 TEMP TEMPORARY LOB_DATA 1 128 1 620 27071 DBSNMP 520mkxqpf15q8 TEMP TEMPORARY LOB_DATA 1 128 1 419 11859 XXXXXXX_XXXX f7rwpfmt8qbds TEMP TEMPORARY LOB_DATA 1 128 1 68 1683 DBSNMP 520mkxqpf15q8 TEMP TEMPORARY LOB_DATA 1 128 1 1403 5365 XXXXXXX 43x5v5s6c4hmv TEMP TEMPORARY LOB_DATA 1 128 1 1458 443 XXXXXXX_XXX 6cs5y9sk09bv7 TEMP TEMPORARY LOB_DATA 1 128 1 1521 25765 QA_XXXXXXX_XXX 17wjjj5cghz9r TEMP TEMPORARY LOB_DATA 1 128 1 1625 3 DBSNMP g1n7yg84rqj0y TEMP TEMPORARY LOB_DATA 1 128 1 1952 1091 XXXXXXX_XXXX 1jhknmxn3zwn7 TEMP TEMPORARY LOB_DATA 1 128 1 2234 1095 XXXXXXX_XXXX f7rwpfmt8qbds TEMP TEMPORARY LOB_DATA 1 128 1 2039 60903 XXXXXXX_XXX 4d3s1h918g6kn TEMP TEMPORARY LOB_INDEX 1 128 1 995 2333 XXXXXXX_XXX 4d3s1h918g6kn TEMP TEMPORARY LOB_INDEX 1 128 1 2089 47 SYSTEM 53zazd5rv1ca9 TEMP TEMPORARY LOB_DATA 1 128 1 1018 17 DBSNMP 520mkxqpf15q8 TEMP TEMPORARY LOB_DATA 1 128 1 24 rows selected. Elapsed: 00:00:00.06
可以發現,比如sid=1374的那一行中,prev_sql_id為38mq996b6vyf9,這條sql經過確認並不會消耗sql語句。
這是因為會話1374曾經執行過消耗了大量臨時表空間的SQL,然後後續有執行了其他SQL,因此Doc ID 317441.1提供的SQL就沒捕捉到1374會話。
因此,想要找出實際的情況,不推薦使用Doc ID 317441.1提供的SQL,用我上邊另外的SQL查詢即可。
至於如何找出會話1374實際消耗temp空間的SQL,用v$open_cursor慢慢找吧。。