匿名用户create table scott.idx_object_id on scott.test(object_id);
现在需要在scott.test的object_id列创建一个索引,比如创建完成后有50GB
中途我怎么查看这个过程,应该是先生成一个临时段,这个临时段的大小怎么看呢?
如果你是关注索引创建的进度,可以查询v$session_longops视图。
评论
有用 0您好,我关注的不是这个进度,是那个临时段的大小变化
评论
有用 0可以试试这个,刚测了下,还不错。
select k.inst_id "INST_ID",
ktssoses "SADDR",
sid,
ktssosno "SERIAL#",
username "USERNAME",
osuser "OSUSER",
ktssosqlid "SQL_ID",
ktssotsn "TABLESPACE",
decode(ktssocnt, 0, 'PERMANENT', 1, 'TEMPORARY') "CONTENTS",
--注意在12c的v$sort_usage定义中TABLESPACE和CONTENTS已经发生变化了。
decode(ktssosegt, 1, 'SORT', 2, 'HASH', 3, 'DATA', 4, 'INDEX',
5, 'LOB_DATA', 6, 'LOB_INDEX' , 'UNDEFINED') "SEGTYPE",
ktssofno "SEGFILE#",
ktssobno "SEGBLK#",
ktssoexts "EXTENTS",
ktssoblks "BLOCKS",
round(ktssoblks*p.value/1024/1024, 2) "SIZE_MB",
ktssorfno "SEGRFNO#"
from x$ktsso k, v$session s,
(select value from v$parameter where name='db_block_size') p
where ktssoses = s.saddr
and ktssosno = s.serial#;
评论
有用 0感谢两位,今天测试已找到方法了,创建的时候dba_segments.segment_type会为TEMPORARY,直到索引创建完毕,根据dba_segments统计即可
评论
有用 0当执行创建索引动作后,可以查询以下sql来监控索引创建的进度:
select L.sid ssid,
l.SERIAL#,
l.START_TIME,
substr(OPNAME, 1, 15) opname,
target,
trunc((sofar / totalwork) * 100) pct,
to_char(60 * sofar * 8192 /
(24 * 60 * (last_update_time - start_time)) / 1024 / 1024 / 60,
'9999.0') Rate,
elapsed_seconds / 60 es,
time_remaining / 60 tr,
PROGRAM,
MACHINE
from gv$session_longops L, gV$SESSION S
where time_remaining > 0
AND L.SID = S.SID;
创建索引默认优先使用 PGA,当 ALLOC GB 超过 PGA 大小时,将使用到临时表空间,并且速度会比较慢,所以需要监控临时表的使用情况:
-- 临时表空间 sort segment 使用情况
select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,added_extents,extent_hits,freed_extents,free_requests,max_blocks,max_used_blocks,max_sort_blocks from gv$sort_segment;
-- 临时表空间的会话信息
select username,session_num,sql_id,tablespace,contents,segtype,segfile#,segblk#,extents,blocks from gv$tempseg_usage;
-- 临时表空间使用情况
select df.tablespace_name "Tablespace",
df.totalspace "Total(MB)",
nvl(FS.UsedSpace, 0) "Used(MB)",
(df.totalspace - nvl(FS.UsedSpace, 0)) "Free(MB)",
round(100 * (1-( nvl(fs.UsedSpace, 0) / df.totalspace)), 2) "Pct. Free(%)"
FROM (SELECT tablespace_name, round(SUM(bytes) / 1048576) TotalSpace
FROM dba_TEMP_files
GROUP BY tablespace_name) df,
(SELECT tablespace_name, ROUND(SUM(bytes_used) / 1024 / 1024) UsedSpace
FROM gV$temp_extent_pool
GROUP BY tablespace_name) fs WHERE df.tablespace_name = fs.tablespace_name(+);
当然也可以提前使用 dbms_space.create_index_cost 来评估索引的大小:,但是准确程度取决于统计信息是否准确,仅供参考:
set serveroutput on
DECLARE
used_bytes NUMBER;
alloc_bytes NUMBER;
BEGIN
dbms_space.create_index_cost('创建索引的语句',
used_bytes,
alloc_bytes);
dbms_output.put_line('index used gb: ' || round(used_bytes/1024/1024/1024,2) || 'G; ' || 'index alloc gb: ' || round(alloc_bytes/1024/1024/1024,2) || 'G;');
END;
/
希望能帮到你~
评论
有用 0
墨值悬赏


