Oracle效能分析10:重建索引續-常用SQL,oraclesql

來源:互聯網
上載者:User

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;
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.