oracle 如何预估将要创建的索引的大小

一.1  oracle 如何预估将要创建的索引的大小

oracle 提供了2种可以预估将要创建的索引大小的办法:

①  利用包 Dbms_space.create_index_cost 直接得到

②  利用11g新特性 Note raised when explain plan for create index

下边分别举例说明。

一.2   环境说明

[[email protected]_lhr ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 26 15:58:06 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

SQL> create table test_index_size as select * from dba_objects;

Table created.

SQL>  EXEC DBMS_STATS.gather_table_stats(ownname => ‘SYS‘,tabname => ‘TEST_INDEX_SIZE‘);

PL/SQL procedure successfully completed.

一.3  第一种 Dbms_space.create_index_cost

脚本:

declare

l_index_ddl       varchar2(1000);

l_used_bytes      number;

l_allocated_bytes number;

begin

dbms_space.create_index_cost(ddl         => ‘create index idx_t on sys.test_index_size(object_id) ‘,

used_bytes  => l_used_bytes,

alloc_bytes => l_allocated_bytes);

dbms_output.put_line(‘used= ‘ || l_used_bytes || ‘bytes‘ ||

‘     allocated= ‘ || l_allocated_bytes || ‘bytes‘);

end;

/

实验:

SQL> set serveroutput on
SQL> declare

2    l_index_ddl varchar2(1000);

3    l_used_bytes number;

4    l_allocated_bytes number;

5  begin

6    dbms_space.create_index_cost(ddl => ‘create index idx_t on sys.test_index_size(object_id) ‘,

7      used_bytes => l_used_bytes,

8      alloc_bytes => l_allocated_bytes);

9    dbms_output.put_line(‘used= ‘ || l_used_bytes || ‘bytes‘ ||

10      ‘   allocated= ‘ || l_allocated_bytes || ‘bytes‘);

11  end;

12  /

used= 383105bytes     allocated= 2097152bytes

PL/SQL procedure successfully completed.

SQL>

PL/SQL 过程已成功完成。
说明:  used_bytes  给出索引数据实际表现的字节数。
      allocated 是当实际创建索引时在表空间中实际占用的字节数。

一.4  第二种11g新特性:Note raised when explain plan for create index

这是一个挺实用的小特性,在11g r2中使用explain plan for create index时Oracle会提示评估的索引大小(estimated index size)了:

SQL> set linesize 200 pagesize 1400;

SQL>  explain plan for create index idx_t on sys.test_index_size(object_id) ;

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------

Plan hash value: 32582980

--------------------------------------------------------------------------------

| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time    |

--------------------------------------------------------------------------------

|   0 | CREATE INDEX STATEMENT |       | 76621 |   374K|   350  (1)| 00:00:05 |

|   1 |  INDEX BUILD NON UNIQUE| IDX_T |       |       |      |        |

|   2 |   SORT CREATE INDEX    |       | 76621 |   374K|      |        |

|   3 |    INDEX FAST FULL SCAN| IDX_T |       |       |      |        |

--------------------------------------------------------------------------------

Note

-----

- estimated index size: 2097K bytes

14 rows selected.

一.5  创建真实索引

SQL> create index idx_t on sys.test_index_size(object_id) ;

Index created.

SQL>  analyze index IDX_T validate structure;

Index analyzed.

SQL> select bytes from dba_segments where segment_name=‘IDX_T‘;

BYTES

----------

2097152

可以看到2种办法给出的索引评估大小与实际索引占用空间差别不大,但这里有个前提条件就是预估索引大小之前必须对表进行分析过。

时间: 2024-10-10 12:09:19

oracle 如何预估将要创建的索引的大小的相关文章

oracle创建序列&索引&视图

---oracle学习 --oracle的管理系统学习 --oracle的数据管理学习 --oracle的用户管理 --oracle二维表管理 --oracle的其他知识 --oracle的序列,视图,索引 --oracle的分页查询 --oracle的数据库备份 --oracle的图形化界面操作 序列 1 --oracle的序列的学习 2 --创建序列 3 --使用 create sequence 序列名 4 --特点1:默认开始是没有值的,也就是指针指在了没有值的位置. 5 --特点2:序列

Oracle学习(十):视图,索引,序列号,同义词

1.知识点:可以对照下面的录屏进行阅读 视图,序列,索引,同义词 SQL> --视图:虚表 SQL> --视图的优点:简化复杂查询,限制数据访问(银行用的多),提供数据的相互独立,同样的数据可以有不同的显示方式 SQL> --第一个视图: 员工号 姓名 月薪 年薪 SQL> create view view1 2 as 3 select empno,ename,sal,sal*12 annlsal from emp; SQL> --如果显示没有权限,则需要授权,见下图1-1

Oracle 学习之 性能优化(十三) 索引

一.索引概念 索引是一种供服务器在表中快速查找一个行的数据库结构.合理使用索引能够大大提高数据库的运行效率. 在数据库中建立索引主要有以下作用. (1)快速存取数据. (2)既可以改善数据库性能,又可以保证列值的唯一性. (3)实现表与表之间的参照完整性 (4)在使用order by.group by子句进行数据检索时,利用索引可以减少排序和分组的时间. 在关系数据库中,每一行都由一个行唯一标识RowID.RowID包括该行所在的文件.在文件中的块数和块中的行号.索引中包含一个索引条目,每一个索

如何创建高效索引

索引创建指南: 1.频繁在where 从句中出现 2.频繁在join关联字段中 3.选择具有高选择性的键 4.别在具有很少的不同值的键上使用B-tree索引.这类键或表达式经常具有较差选择性,所以不会是性能有更多的优化, 5.除非经常选择的值比其他的值出现的频次要低.要是这种情况,可有效使用位图索引,但是如果在高并发的OLAP系统,位图索引要是经常被改动,则不要使用位图索引. 6.不要在常被修改到字段上建索引. 7.不要对仅出现在where从句中的函数或表达式中的字段建索引,要么就建函数索引 8

oracle学习篇十二:索引

索引: 查询User_indexes可以获取有关用户已创建的索引的详细信息. 查询User_ind_partitions可以获取有关用户已创建的分区索引的详细信息. 查询User_ind_columns可以获取有关列(用户的索引是基于这些列创建的)的详细信息. 索引类型:唯一索引.组合索引.反向键索引.位图索引和基于函数的索引. 索引在逻辑上物理上都独立于关联表中的数据,在任何时候都可以创建或删除索引,而不会影响基表或其它索引. 1.创建普通索引的语法:Create INDEX index_na

Oracle tablespace 表空间创建和管理

1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的逻辑组成 1.oracle 的逻辑结构包含 表 空间 段 区 块 2.数据库是由表空间构成,表空间又是有段构成,段是由区构成,区是由 oracle的块构成,这样做是为了提高数据库的效率 3.作用 A.控制数据库占用的磁盘空间 B dba 可以将不同数据类型部署到不同的位置,这样 有利于i/0的性能,

oracle 19c虚拟要下自动索引测试

1.关于测试 最近oracle举办了一系列线上分享,其中一个19c的新特性是自动索引.自己在docker中测试了一下,失败. [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Feb 20 09:44:52 2020 Version 19.3.0.0.0 SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','

[转]Oracle DB 使用RMAN创建备份2

归档备份:概念 归档备份:概念 如果需要在指定时间内保留联机备份,RMAN 通常会假定用户可能需要在自执行该备份以来到现在之间的任意时间执行时间点恢复.为了满足这一要求,RMAN 会在此时段内保留归档日志.但是,可能仅需要在指定的时间(如两年)内保留特定备份(并使其保持一致和可恢复).用户不打算恢复到自执行该备份以后的某一时间点,只是希望能够正好恢复到执行该备份的确切时间.此外,用户还需要维护保留策略以使备份区井然有序,因此无法使备份恢复到两年前.为了满足保留数据的商业或法律要求,通常需要这么做

MySQL创建复合索引

在MySQL数据库中,创建复合索引的时候,不知道在创建过程中哪个列在前面,哪个列该在后面,用以下方式即可: select count(distinct first_name)/count(*) as first_name_selectivity,count(distinct last_name)/count(*) as last_name_selectivity,count(*)from actor\G mysql> select count(distinct first_name)/count