Oracle效能分析10:重建索引續-常用SQL,oraclesql
上一節講了重建索引的原因和重建方法,這節繼續介紹幾個常用的SQL語句和預存程序。
查詢所有失效的全域索引
select index_name, status from user_indexes where table_name = upper(table_name) and status = 'UNUSABLE'
查詢所有失效的分區索引
select index_name, status from user_ind_partitions where index_name in (select index_name from user_indexes where table_name = upper(table_name) and partitioned = 'YES') and status = 'UNUSABLE'
線上重建所有的全域索引
下面的預存程序將線上重建指定表格的所有全域索引。
declare v_table_name varchar2(100) := upper(table_name);begin for i_index_name in (select index_name from user_indexes where table_name = upper(v_table_name) and partitioned = 'NO') loop dbms_output.put_line(i_index_name.index_name); execute immediate 'ALTER INDEX ' || i_index_name.index_name || ' REBUILD ONLINE'; end loop;end;
線上重建所有失效的全域索引
下面的預存程序查看指定表格的所有全域索引,並線上重建所有失效的全域索引。
declare v_table_name varchar2(100) := upper(table_name); v_status varchar2(8);begin for i_index_name in (select index_name from user_indexes where table_name = upper(v_table_name) and partitioned = 'NO') loop select status into v_status from user_indexes where index_name = i_index_name.index_name; if v_status = 'UNUSABLE' then dbms_output.put_line(i_index_name.index_name); execute immediate 'ALTER INDEX ' || i_index_name.index_name || ' REBUILD ONLINE'; end if; end loop;end;
線上重建所有的分區索引
下面的預存程序線上重建所有的分區索引。
declare v_table_name varchar2(100) := upper(table_name);begin FOR i_index_name IN (SELECT index_name FROM user_indexes WHERE table_name = upper(v_table_name) and partitioned = 'YES') LOOP FOR i_partition_name IN (SELECT partition_name FROM user_tab_partitions WHERE table_name = upper(v_table_name)) LOOP dbms_output.put_line(i_partition_name.partition_name || ' : ' || i_index_name.Index_Name); execute immediate 'ALTER INDEX ' || i_index_name.Index_Name || ' REBUILD PARTITION ' || i_partition_name.partition_name || ' ONLINE'; END LOOP; END LOOP;end;
線上重建所有失效的分區索引
下面的預存程序查看指定表格的所有分區索引,依次遍曆每個分區,並線上重建所有失效的分區索引。
declare v_table_name varchar2(100) := upper(table_name); v_status varchar2(8);begin FOR i_index_name IN (SELECT index_name FROM user_indexes WHERE table_name = upper(v_table_name) and partitioned = 'YES') LOOP FOR i_partition_name IN (SELECT partition_name FROM user_tab_partitions WHERE table_name = upper(v_table_name)) LOOP SELECT status into v_status FROM user_ind_partitions WHERE index_name = i_index_name.index_name and partition_name = i_partition_name.partition_name; if v_status = 'UNUSABLE' THEN dbms_output.put_line(i_partition_name.partition_name || ' : ' || i_index_name.Index_Name); execute immediate 'ALTER INDEX ' || i_index_name.Index_Name || ' REBUILD PARTITION ' || i_partition_name.partition_name || ' ONLINE'; END IF; END LOOP; END LOOP;end;
也可以為上面重建索引使用nologging和compress(見重建索引)參數。
oracle索引問題,刪除再重建索引與索引分析
1. 應該是可行的, 具體 會不會節省時間 試一下就可以了。
2. 大概每個月儲存四五十萬的資料,裡面只儲存最新四個月的資料
每次create這7個索引用時都特別長,大概需要三四個小時;
200萬的資料,重建索引花費的時間太長了;很奇怪。
3. 估計之前的 先drop掉索引,然後插入資料完畢後create索引 也是為了避免 插入資料時,索引對插入效率的影響。
在PL-SQL中怎給oracle資料庫重建索引?
如果5條都要插入的話就要用到遊標了.
declare cursor table3_cursor is
select tet from table3;
maxid table2.ID%type;
begin
select ID into maxid from table2;
insert into table1 (id,name) values (22,maxid);
for idx in table3_cursor loop --idx可以看作是從遊標中取出的值,這裡就可--以看作是txt,迴圈取出table3中的txt
insert into table2(id,content,Date)
values(maxid,idx.txt,sysdate);
end loop;
end;