【eNet硅谷动力专稿】在数据库领域,一些小招数有可能会大服务提高数据库的性能,Veterans Affairs Department的数据仓库管理人员发现。
为了更好地了解即将发布的微软数据库大作Microsoft SQL Server 2008是如何工作的,Veterans Affairs Department已经在一个生产环境中运行了这个数据库管理软件的高级版本,用于将VA临床交易数据移动到数据仓库中。
管理团队发现,SQL Server 2008的其中一个较新的功能可以减少查询时间。这一功能称之为分割(partitioning),它能够可让使用者将数据库表划分成更小的单位。以VA临床交易数据为例,一个大的信息表可以按照年被分割成一些较小的部分。因此,当一个用户只查询去年的所有记录时,该结果就会被更快地返回,这点很容易理解,因为数据库引擎只需扫描去年的数据库记录而无需扫描所有数据记录,VA数据仓库管理人员说。
有时候,一个很小的调整就能很惊人的效果。无论你是运行一个单一MySQL实例来为某个小部门保存一些数据纪录,还是使用Oracle 11g数据库来管理海量数据,你都可能通过调整你的数据库系统获得好处。
不过,这通常被数据库管理人员所忽视。当企业管理者抱怨说,他们的应用运行的速度太慢---这往往是IT部门收到的最多的投诉---系统管理员查看的第一个地方通常就是服务器。不过,“他们通常不考虑对服务器进行调整,”远程数据库管理供应商Pythian Group 的数据库管理员Sheeri Cabral说。
相反,她表示,检查和改进数据库查询的结构和数据库数据库架构设计能够提高数据库效能。一些小的调整通常能给数据库的执行速度和结果的准确性带来巨大的改善。
总部设在纽约的数据库咨询公司Ronald Bradford表示:“一般来说,大部分的性能问题都要回到良好的设计上来,”
是否标准化
当获得一个数据库后,第一部工作往往是标准化---将重复数据削减到最低限度。
上个月在俄勒冈州的波特兰举行的O’Reilly Open Source大会上,电子邮件系统提供商Message Systems的高级销售工程师Mike Hillyer解释了标准化的概念
特别是在小型机构,数据库开始是作为一个大型电子数据表来使用。用数据库的术语说,这就是所谓的超级表---所有的信息都被存储在一个单一的表中。刚开始,把所有数据放在一个表格上是很方便,不过随着数据量的增长,从超级表中提取和聚集有用的信息变得越来越困难。
虽然标准化不能从本质上提高性能,但是它可以提高数据质量和整理数据库设计,这反过来又可以加快搜索速度。
标准化使得每个数据库条目或数据行都有一个主键,也就是一个能够将这个数据记录与其它记录区别开来的键值。更重要地是,一个标准化的数据库包含很少的重复数据或者多次出现的数据项。
举例来说,在一个存储了书名和各自作者的数据库中,一个作者可能有很多本作品---这就是所谓的垂直冗余。或这一本书也可能有一个以上的作者,这就造成了重复的数据列,称之为横向冗余。
这些冗余有可能会带来麻烦。如果一个作者的名字被存储在数据库的多个地方,如果在某个地方这个名字拼写有误,那么有关这个名字的搜索就会“遗失”该条目。当有修改一个地址时,那么你必须将数据库中的所有相同地址进行修改。横向冗余会使数据库的规模碰撞。
Hillyer曾经为某个政治活动维护过一个数据库,其中存储了大约150,000选民名字和其地址。每一次他们进行民意调查的时候,他们就会为每一个问题增加新的数据列。“我们当时非常害怕,我们用光了所有的数据列,”Hillyer说。此外,数据库的大部分空间都还没有使用。一次调查设计的受访者数据大约有500人,但是答案列却要追加到所有的150,000条数据中。“所以149,500行数据都含有从来都不会使用的列,” Hillyer说。
创造额外的数据库表格可以将冗余降至最低。不要在数据库中多次存储某个名称或地址,而是只在一个表格中存储它一次,每当需要有关名称或地址的信息时,只需要将指针执行这个表格。同样,所有作者也都需要被存在一个表格中,而每本书的信息条目只需要简单的将指针指向作者表就行了。
下一阶段的标准化工作涉及到合理地安排数据表,使得每个条目的一些字段能够组成一个复合主键---这意味着所有的数据条目都不存在任何重复数据。“表中的每个数据都必须与复合主键有某种联系,这是确保该数据属于这个表的必要条件,”Hillyer说。“否则,它就应该被在其它地方。”
第三阶段的标准化需要特别谨慎,稍不留神,就会出错。不过Hillyer说,如果你完成了前两个阶段的标准化,那么第三阶段的标准化也就很容易了。在这一阶段,数据表的每个字段都必须依赖于主键。例如,如果数据库中的某个表包含有地址、州名和邮编等几个字段,那么,州名这个字段就是多余的,因为它是可以通过邮编得到的。所以,有关州名和邮编的关系可以在另一个表中定义。
在另一方面,太多的标准化可能会使数据库的反应速度变慢,Cabral说。
Cabral举了一个银行帐户的例子。通过执行严格的标准化规则,客户帐户的余额不应该出现在数据库的任何一个表格中。毕竟,它可以通过该帐户的所有收入和支出计算出来。不过,当客户需要知道自己帐户的余额时,这样一个计算过程将需要大量的资源和时。而在数据库中增加一个保存用户帐户余额的字段则是一件比较容易的事情,即使这可能与标准化的准则相抵触。
“所以,数据库标准化也是需要有折中考虑的,”她说。“数据的完整性越高,复杂性也越高。所以有时候,你是否愿意与标准化规则发生一些抵触但却换来了更高的速度呢?”
“仔细看看你的应用程序是做什么用的,然后从标准化的表结构开始,仔细检查这些结构,并将那些影响速度的部分‘非标准化’。”Cabral说。查询分析
在波士顿举行的一年一度的Usenix大会上,Cabral领导召开了一个关于数据库微调的会议。她坚持认为查询微调是加快反应速度的一种技术。
从一个关系数据库中获得任何信息都需要一个SQL(结构化查询语言)查询,SQL语句是查询数据库的一个固定格式。SQL查询语句最基本的要素是需要一个表名,你所查询的信息就来自于这个表,然后你还需要一种查询规则,利用该规则你就能得到一系列匹配的数据列,或许你要找的信息就在这些数据列中,最后你还需要一些制令对查询结果进行分组。
专家表示,有很多构造数据库查询的方法,但是如果你想要迅速得到速度库的回应,那么你写的查询语句需要让数据库执行的操作尽可能得少。
对于大型系统来说,构造高效的SQL语句是一门艺术。“我喜欢使用整体的方法,从‘这一查询到底是用来干什么’着手。” Cabral说。
比说,你要查找某个地区登陆到某个在线系统的所有人的姓名。“那么你是先查询登陆过在线系统的所有人然后再从中寻找那些属于某个地区的人,还是先查询属于某个区的所有人然后再从中寻找那些登陆过在线系统的人呢?” Cabral说。完成这一查询的正确思路应该是从最小的候选人集合开始,然后一步步缩小范围。因为初始数据量越少,数据库引擎所要完成的工作就越少。
但请记住,你需要让数据库完成尽可能多的排序工作,而不需要让应用程序来干这种事情,甲骨文公司核心技术部副总裁Tom Kyte说。Kyte在甲骨文的官方网站上就数据库查询问题有自己的建议栏。
但是,却很少有人能做到,Kyte说。应用程序开发人员---不是数据库管理员---创建了数据库和应用程序的接口。因此,程序员往往让应用程序做排序工作而不是数据库,但实际情况却是数据库更适合这项工作,遗憾的程序员往往对此不是很了解。
开发人员往往只负责编写程序代码,也就是说用户反复执行简单任务的程序。这写程序的执行时间要比一个精心优化的SQL语句要长得多,Kyte说。
“优化器掌握了你想要完成的任务的很多信息,并且它可以为你提出很多最优的实现方法,”他说。
现在,所有的数据库都有查询分析器,或者是SQL查询语句检查工具,这些工具能够对用户所写的SQL语句进行修改使它们运行起来更有效率。甲骨文公司在其企业管理器绩效诊断包(Oracle Enterprise Manager Performance Diagnostic Pack)中提供了一个查询分析器。其它一些能够帮助数据库管理员更好的查看SQL查询语句执行情况的工具有开源的Snowflake和MySQL Proxy。
深入了解你的数据库
最后也是最重要的一个准则是你一定要对于自己所使用的数据库有一个深入的了解,知道它的特点是什么,Bradford说。
尽管所有的关系数据库都能执行的SQL语句---尽管执行深度有所不同---每个数据库都有一套不同的管理工具和定制化。了解这些工具的工作流程将有助于缩短数据库的响应时间。
“MySQL与Oracle数据库的工作机制是不同的,” Bradford说。举例来说,Oracle数据库对于所有的数字就只有一种数据类型。Bradford曾经管理过一个MySQL数据库,在Bradford接手之前,该数据库是由一个Oracle数据库管理员设计的,并且该MySQL数据库中的所有数据类型都是用Oracle数据库中常用的通用数字类型表示的。Bradford接手后,将数据库中的通用数字类型都转化成了更具体的MySQL数据类型,这带来的结果是将原有的12G的数据量缩减了85% 。
“了解你所使用的数据库的每一个细节,那么你会受益匪浅的。如果网上有这方面的帮助手册,我建议你要一页一页仔细看。”布拉德福德说。