如何用hash关键字提高数据库性能

普通的SQL Server应用程序要求支持一个或几个长字符串搜索。(本文中,我们称超过20个字符的字符串为长字符串。)假如前端应用程序希望允许用户提供两个字符串;你启动一个执行这两个字符串搜索任务的存储程序,然后应用两个相关列目录对搜索进行优化。在小型的表格中,你可能注意不到产生的效果。但是,如果表格包含5 000万行,它就会影响存储程序与搜索性能。

应用称为hash关键字(引用单独一个hash)或hash桶(一个hash关键字集合)的字符串目录的优秀方法可大大节省磁盘空间并提高性能。

何为hash(hash)

hash是应用一个指定字符串算法的整数结果。有各式各样的hash算法,但最常用的是内置的SQL函数Checksum()。通常,你给这个函数一个字符串,它就返回一个整数(在大型表格中,我们不能保证这个整数的唯一性)。

数据库设计中的hash表格

假设在我们感兴趣的表格中有这些列:

列名 数据类型
名称 Varchar(50)
组名称 Varchar(50)

这两个列的多列目录每行会耗用50+50个字符,加上上面提到的5 000万行,这可是个相当大的难题。

基于这两个列的hash关键字相当的小,即每行四个字节。如果我们不将hash关键字存储在这一列的目录中,它还会更小。相反,我们应该建立一个计算列,该列的公式是这两个列的hash关键字,然后将那个列编入目录并忽视字符串对的目录。

用户(不管是人还是应用程序)查询感兴趣的值;然后我们将参数转换为hash关键字并搜索hash目录。副本集合要比引擎必须访问的行集合小得多,以便对查询值进行精确匹配。然后将hash关键字搜索与两个感兴趣的列的比较结合起来,隔离出一个小型的行子集,并对两个列进行检验,找出匹配值。基于整数列的搜索比基于长字符串关键字的搜索要快得多,同样也比复合关键字搜索快得多。

应用Checksum函数作hash关键字运算

尝试运行这段样本代码,它表明如何获得指定值或值组合的hash关键字:

USE AdventureWorks
SELECT Name, GroupName, Checksum(Name,GroupName)AS HashKey
FROM Adventureworks.HumanResources.Department
ORDER BY HashKey

所得的结果显示在下表中(为求简洁,只选用了10个结果)。

名称 组名称 hash关键字
工具设计 研究与开发 -2142514043
生产 制造 -2110292704
发货与收货 存货管理 -1405505115
购买 存货管理 -1264922199
文件控制 质量保证 -922796840
信息服务 总执行管理 -904518583
质量保证 质量保证 -846578145
销售 销售与营销 -493399545
生产控制 制造 -216183716
营销 销售与营销 -150901473

在现实环境中,你可以建立一个调用Name_GroupName_hb的计算列。假设前端传入名称(Name)与组名称(GroupName)的目标值,你就可以用下列代码来处理这一问题:

CREATE PROCEDURE DemoHash
( ?@Name Varchar(50), ?@GroupName Varchar(50)
)
AS
-- USE AdventureWorks
DECLARE @id as int SET @id = Checksum(@Name,@GroupName)
SELECT * FROM Adventureworks.HumanResources.Department
WHERE HashKey = @id
AND Name = @Name
AND GroupName = @GroupName

想象一下,在一个5 000万行的表格中,返回了100行指定的hash关键字。由于这两个列没有其它的目录,查询优化器就应用hash桶目录。这样就可以快速地隔离出100个感兴趣的行。然后我们访问这些行,检验名称(Name)与组名称(GroupName)列来进行精确匹配。这样就大大提高了性能,同时节省了大量的磁盘空间。

引例假设搜索目标存在于一个单独的表格中。假如要从多个表格中选择目标来进行搜索,也可以应用同样的技巧。只需建立一个连接表格的表格函数,然后建立一个hash不同表格列的目录即可。

结论

在相对较小的表格中,建立一个目录hash桶对于提高性能可能没有太大的作用,但这样做可节省磁盘空间。如果你使用大型的表格,本技巧就极为实用。

Arthur Fuller从事数据库应用程序开发20余年。在Access ADP、微软SQL 2000、MySQL和.NET方面有丰富的经验。

时间: 2024-12-07 07:38:16

如何用hash关键字提高数据库性能的相关文章

连接缓冲池提高数据库性能

数据|数据库|性能 如果你的ASP应用程序与数据库交互的话(我想肯定得访问数据库的,要不然用ASP干嘛?),使用连接缓冲池将大大提高数据库的性能. 建立一个到数据的连接所花费的时间和系统资源并非微不足道的. 当每个需要建立数据库连接实例的页面被访问到时,一个新的连接对象将被创建,并在该页面执行完后销毁,如果有许多人同时访问你的站点的话,访问者们将发现系统性能变得很低. 连接缓冲池维持着连接实例,以便用户可以随时使用数据库连接. 比如说,你有一个ASP页面创建了一个到SQL数据库的连接,从数据库中

连接模式:提高数据库性能的捷径

一.共享服务器模式. 共享服务器模式,也叫做多线程服务器模式.在这种模式下,Oracle数据库允许多个用户进程共享非常少的服务器进程.所以,可以同时实现用户并发访问的人数也就大大的增加.如果使用专用服务器模式,则每个用户连接数据库时,每个用户进程需要他自己的专用服务器进程.也就是说,客户端进程与服务器端进程是一一对应的. 而如果采用共享服务器模式的话,则多个用户可以共用一个服务器进程,也就是说,此时客户端进程与服务器进程是多对一的情况.这主要是通过调度程序来实现的.调度程序将多个加入数据库访问会

提高数据库性能及实用性的优化方法

数据交互复杂度与频度的提升,导致了数据库在运维.迁移和规模扩展进程中的性能问题.作为一项确保http://www.aliyun.com/zixun/aggregation/13597.html">企业IT基础部件健康运营的关键技术,数据库性能优化的实现路径和IT系统管理架构越来越密不可分. 在数据库成熟应用的时代,数据库的性能优化已经演变为一项相当严密的系统工程.作为企业IT基础设施的核心部件之一,数据库并不是孤立的系统,它与网络.操作系统.存储等硬件系统紧密相连,这种与其他IT部件的多重

连接模式,提高数据库性能的捷径

一.共享服务器模式. 共享服务器模式,也叫做多线程服务器模式.在这种模式下,Oracle数据库允许多个用户进程共享非常少的服务器进程.所以,可以同时实现用户并发访问的人数也就大大的增加.如果使用专用服务器模式,则每个用户连接数据库时,每个用户进程需要他自己的专用服务器进程.也就是说,客户端进程与服务器端进程是一一对应的. 而如果采用共享服务器模式的话,则多个用户可以共用一个服务器进程,也就是说,此时客户端进程与服务器进程是多对一的情况.这主要是通过调度程序来实现的.调度程序将多个加入数据库访问会

SQL语句优化提高数据库性能_MsSql

性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化.为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设法对之进行简化. 常见的简化规则如下: 1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果 3)少用子查询 4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出S

SQL语句优化提高数据库性能

性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化.为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设法对之进行简化. 常见的简化规则如下: 1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果 3)少用子查询 4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出S

通过缓存数据库结果提高PHP性能

缓存|数据|数据库|性能 众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得到满足,从而不必连接到数据库.执行查询以及获取结果. 但当您使用的数据库与 Web 服务器位于不同的计算机上时,缓存数据库结果集通常是一个不错的方法.不过,根据您的情况确定最佳的缓存策略却是一个难题.例如,对于使用最新数据库结果集比较重要的应用程序而言,时间触发的缓存方法(

从外到内提高SQL Server数据库性能

如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能.如下图: 第一层:网络环境. 到企业碰到数据库反映速度比较慢时,首先想到的是是否是网络环境所造成的.而不是一开始就想着如何去提高数据库的性能.这是很多数据库管理员的一个误区.因为当网络环境比较恶劣时,你就算再怎么去改善数据库性能,也是枉然. 如以前有个客户,向笔者反映数据库响应时间比较长,让笔者给他们一个提高数据库性能的解决方案.那时,笔者感到很奇怪.因为据笔者所知,这家客户数据库的

通过缓存数据库结果提高PHP性能(4)

构建客户端 现在,您已经针对 ORDERS 和 ORDER_ITEMS 表创建了注册,下面我们将了解一下访问这些表中存储的订单及其订单项的客户端应用程序如何使用更改通知.为此,您可以构建一个 PHP 应用程序,它将缓存针对以上表的查询结果,并采取相应的操作来响应有关对这些表所做更改的通知(从数据库服务器中收到这些通知).一个简单的方法是使用 PEAR::Cache_Lite 程序包,它为您提供了一个可靠的机制来使缓存数据保持最新状态.尤其是,您可以使用 Cache_Lite_Function 类