Oracle中利用哈希函数提高查询速度

oracle|函数|速度

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

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

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

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

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

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

  
  create cluster credit_cluster
  (
  card_no varchar2(16),
  transdate date sort
  )
  hashkeys 10000 hash is ora_hash(card_no)
  size 256;
  
  
  create table credit_orders
  (
  card_no varchar2(16),
  transdate date,
  amount number
  )
  cluster credit_cluster(card_no,transdate);
  
  
  alter session set nls_date_format = "YYYYMMDDHH24MISS";
  insert into credit_orders (card_no,transdate,amount)
  values ('4111111111111111','20050131000123',57.99);
  insert into credit_orders (card_no,transdate,amount)
  values ('4111111111111111','20050130071216',16.59);
  insert into credit_orders (card_no,transdate,amount)
  values ('4111111111111111','20050131111111',39.00);
  insert into credit_orders (card_no,transdate,amount)
  values ('4111111111111111','20050130081001',25.16);
 

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

时间: 2024-10-04 12:16:39

Oracle中利用哈希函数提高查询速度的相关文章

用户口令保密-利用哈希函数的技术实现两个安全需求

问题描述 利用哈希函数的技术实现两个安全需求 在一个广域网的应用环境,用户使用用户名和口令的方式登入到远程的服务器上,服务器的管理员给每个用户设置一个初始口令,请利用哈希函数的技术实现以下安全需求. 1. 用户口令在广域网上安全传输(也就是说,即使攻击者窃取用户网上传输的信息,也分析不出口令). 2. 管理员也不知道用户的口令. ** 请设计一个方案满足上述的安全需求并分析其安全性.**

如何使用索引提高查询速度_Mysql

使用索引提高查询速度1.前言在web开发中,页面模板,业务逻辑(包括缓存.连接池)和数据库这三个部分,数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈.本文主要针对MySql数据库,双十一的电商大战,引发了淘宝技术热议,而淘宝现在去IOE(I代表IBM的缩写,即去IBM的存储设备和小型机;O是代表Oracle的缩写,也即去Oracle数据库,采用MySQL和Hadoop替代的解决方案,;E是代表EMC2,即去EMC2的设备性,用PC Server替代EMC2),大量采

提高查询速度方法总结

这个帖子主要总结提高查询速度的方法,涉及到减少连接数据库次数.建立索引.优化语句等方面. 关于索引,推荐转载的这篇文章http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx 改善SQL语句的效率http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669数据量很大怎样加快索检速度http://community.csdn.net/Expert/topic/

在Word2007中通过隐藏图片来提高浏览速度

  在Word2007中通过隐藏图片来提高浏览速度 1.打开一篇图文并茂的长篇文档,单击其左上方的"office按钮"在弹出的下拉菜单中选择"Word选项"按钮; 2.在弹出的对话框中单击左侧区域的"高级"选项,然后在其右侧通过下拉滚动条找到"显示文档内容"区域,在"显示图片框"选项前面的复选按钮上打上勾,之后单击"确定"选项; 3.回到文档中你会发现正文的图片已经被隐藏,只剩余了图片框

Oracle中利用DETERMINISTIC声明提高性能(一) ARRAY对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述ARRAY对性能的影响. 关于DETERMINISTIC函数,以前已经写过一些文章了,不过对于DETERMINISTIC声明用来提高性能只是简单提了一句,并没有展开来说. 由于函数声明了DETERMINISTIC特性,Oracle对于相同的输入,可以只运行一次,而这对于代码比较复杂,调用时间较长的函数而言,确实可以提高性能. 但是在上面的几篇文章中也提到了,DETER

Oracle中利用DETERMINISTIC声明提高性能(二) 参数顺序对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述参数顺序对性能的影响. 上一篇文章提到了,如果希望通过DETERMINISTIC来获取性能收益,那么采用批量方式是必须的,而且数组的值相对而言越大对于性能的帮助会越大. 但是这里存在一个问题,如果需要处理的数据量本身很大,虽然重复的输入参数不少,但是总的参数不同的值更多,那么即使将ARRAY的值设置到1000,能带来的性能收益也很有限,因为即使1000次调用,也不能保

Oracle中利用数据泵导出查询结果(一) 数据泵的QUERY功能

在ITPUB上看到有人提出这个问题,能否利用数据泵导出一个查询结果.事实上数据泵还真的具有这个功能. 建立一个简单的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, N

oracle中110个常用函数介绍_oracle

1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2. CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C --

Oracle中利用存储过程建表

Oracle中存储过程不可以执行DDL语句,但是我们可以利用动态sql语句来建立表格. 如下:   代码 create or replace procedure spCreateTestTableis    v_CreateString varchar2(1000);begin    declare        v_count number;    begin        v_count := 0;                select count(*)        into v_c