暂无图片
Oracle创建索引
我来答
分享
暂无图片 匿名用户
Oracle创建索引

create table scott.idx_object_id on scott.test(object_id);


现在需要在scott.test的object_id列创建一个索引,比如创建完成后有50GB

中途我怎么查看这个过程,应该是先生成一个临时段,这个临时段的大小怎么看呢?

我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新
赵勇

如果你是关注索引创建的进度,可以查询v$session_longops视图。

暂无图片 评论
暂无图片 有用 0
官方小可爱

您好,我关注的不是这个进度,是那个临时段的大小变化

暂无图片 评论
暂无图片 有用 0
张sir

可以试试这个,刚测了下,还不错。

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
官方小可爱

好的,感谢感谢,收藏了

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏