数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

用排序哈希簇来提升ORACLE查询速度


发布日期:2019年01月26日
 
用排序哈希簇来提升ORACLE查询速度

当数据存储在一个普通表中的时候这些记录将以插入到数据库时的顺序物理地保存到分配的块中例如如果有一个用于存储员工信息的表那么员工姓名将会按照插入到表的顺序存储在表中

如果员工记录非常多的话那么数据表的响应速度就会逐渐变慢你可以通过选择值相对等分布的一列(如员工的部门编号)并建立一个簇表来提高查询员工的速度

在簇表中如果员工属于同一个部门那么它们的记录将物理地存储在同一系列的块中这样就可以提高查找员工信息的速度这是因为在检索某个特定部门的员工时需要读取数据库块的数量减少了而在非簇表中查找员工就可能需要对每个数据库块进行访问

当表中存在大量键值的时候你就会开始发现由于存在许多簇块而导致的性能问题避免这个问题的一个方法就是使用一个哈希函数来约束簇块的数量哈希函数将会给定一个数值用来限定簇块数量的预计范围但它得到的值是相对等分布的例如你可以创建一个哈希函数只比较部门编号的最后两位

哈希函数中存在的一个问题就是函数值会打乱记录原本的顺序你可以通过 ORDER BY来解决这个问题但是在很多情况下记录数量是非常庞大的在Oracle g 中你可以将一个数据定义为natural order 那么就可以不用经过排序而以你所希望的顺序来检索哈希簇的数据从而解决了上面的提出问题

例如假设你有一个信用卡业务的数据库你决定以信用卡号作为簇主键将有利于数据的存储分布但是由于存在大量的信用卡号所以可以使用一个哈希函数来约束簇块的数量而且你希望在你的大部分报表中数据是按照时间顺序排列的那么在进行每个查询操作时使用排序哈希簇而不要使用ORDER BY下面给出了相关语句

create cluster credit_cluster

(

card_no varchar()

transdate date sort

)

hashkeys hash is ora_hash(card_no)

size ;

create table credit_orders

(

card_no varchar()

transdate date

amount number

)

cluster credit_cluster(card_notransdate);

alter session set nls_date_format = YYYYMMDDHHMISS;

insert into credit_orders (card_notransdateamount)

values ();

insert into credit_orders (card_notransdateamount)

values ();

insert into credit_orders (card_notransdateamount)

values ();

insert into credit_orders (card_notransdateamount)

values ();

可以看到我在这里使用了一个新函数ORA_HASH 来为信用卡建立一个哈希数值现在你可以非常简单地对某个信用卡数据进行查询并返回自动排序后的结果

上一篇:Oracle诊断工具-RDA使用概述

下一篇:关于Oracle几种锁管理的汇总