理解B树索引

选择和优化索引

理解B树索引(BANLANCE)

1建表

createtablecust(

cust_idnumber,

last_namevarchar2(30),

first_namevarchar2(30));

2确定多个SQL查询会频繁在where子句使用last_name列,创建下列索引:

createindexindex_idx1oncust(last_name);

插入数据

insertintocustvalues(7,'ACER','SCOTT');

insertintocustvalues(4,'KAN','JIM');

insertintocustvalues(2,'FAN','BOB');

insertintocustvalues(9,'STAR','KIM');

...

insertintocustvalues(117,'ACER','SID');

3更新表统计信息,为查询优化器提供足够信息

SQL>execdbms_stats.gather_table_stats(ownname=>'mlq',tabname=>'CUST',cascade=>true);

插入更多的数据,从表及索引中查询数据,有三种可能的块景:

A所有数据全在索引数据块

发生索引范围描扫索引快速全扫描

selectlast_namefromcustwherelast_name='ACER';范围扫描

自动跟踪:

setautotraceon

selectcount(last_name)fromcust;

发生索引快速扫描,

通过查看执行计划及统计信息,可以得到更详细的结果

B并不是所有信息都包含在索引中

selectlast_name,first_namefromcustwherelast_name='ACER';

访问first_name通过rownid

C仅访问表数据块

select*fromcust;

全扫描

B树索引是oracle默认的索引类型,对于大多数oltp来说足够了。

它是很高效的,恰当使用,会使查询快很多,如果索引结构本身含含查询要获取的列值,

那么就不需要访问表数据块。要理解这个原理,写出高效索引,确定要创建索引的列,

以及判断对某些查询来说组合查询是否更为高效。

估算一个索引所需要的空间

创建一个索引前,可以通过存储过程来估算所需的空间

setsererouton

execdbms_stats.gather_table_stats(user,'CUST');

variableused_bytesnumber

variablealloc_bytesnumber

execdbms-space.create_index_cost('createindexcust_idx2oncust(first_name)',:used_bytes,:alloc_bytes);)

print:used_bytes

print:alloc_bytes

查看输出结果

你可能感兴趣的:(B树索引)