首页 理论教育数据库性能管理与调优:快速有效的SQL优化方法

数据库性能管理与调优:快速有效的SQL优化方法

【摘要】:而重中之重仍然是调优访问数据库SQL语句的方法,因为很少能像SQL调优这样可以在短时间内以低成本得到效果。因此,为了性能考虑,开发者应不遗余力地投入时间和精力进行SQL调优。如果对未优化的SQL进行调优,则计划增设容量的许多企业都无须执行容量增设。大量数据排序的SQL或者大量访问数据块的未优化的SQL,可能会过量地使用内存。就因为这种现象,才会因未优化的SQL而出现磁盘I/O增加的情况。SQL的优化过程必然也涉及索引的优化。

现在我们处于信息化时代,日常生活中的每一步都会被记录成为信息的世界。那么保存和管理这些庞大信息的地方在哪里呢?过去我们使用文件记录保存信息,而如今计算机和互联网高度发达,则在数据库中保存和管理信息。企业通过数据库管理和应用大量的信息创造了巨额利润,但有效地管理日益剧增的信息非常困难。企业也因为数据增加和业务的多样化遇到性能问题及相关难处,但幸运的是,有多种方法可以改善正在运行中的数据库的性能。而重中之重仍然是调优访问数据库SQL语句的方法,因为很少能像SQL调优这样可以在短时间内以低成本得到效果。因此,为了性能考虑,开发者应不遗余力地投入时间和精力进行SQL调优。

DBMS性能下降的问题会失去客户的信任,而此类问题无法在几日内得到解决。因此,必须投入大量的时间和金钱才能解决性能问题。数据库性能下降是会给企业带来巨大损失的原因之一。

为什么会发生诸如此类的性能问题呢?性能问题可以由许多因素引起,包括:在构建数据库时,由于以结果为主的构建和时间计算问题,未能构建优化性能的数据库;随着使用发生性能下降的现象,未能优化访问数据库的SQL的情况占多数等。现已知设计不良的数据库会影响性能,但为什么说SQL是降低数据库系统性能的罪魁祸首呢?现在开始介绍SQL降低数据库系统性能的原因以及解决该问题的方法。

未进行优化的SQL性能降低一般有两个原因:不必要的数据块访问增加;资源使用增加。

1)确认不必要的数据块的访问增加

SQL的性能取决于相应SQL访问的数据块的数量。例如,我们从互联网下载文件时,下载1MB大小的文件和下载 100 MB大小的文件时速度有何差别?任何人都知道下载1MB的文件时速度快很多。那么如果要在包含相同内容的1MB大小的文件和100 MB大小的文件中选择一个文件下载,会下载哪个文件呢?当然会下载花费时间较少的1MB大小的文件。数据库性能管理中有些人常会认为包含相同内容的1MB大小的文件是否会与100 MB大小的文件毫无区别。

出于这个原因,我们必须优化 SQL。在大容量数据库中,不只是 1 MB和 100 MB的差别,出现1 MB和10 GB以上差别的情况也很常见。利用查询功能10秒钟就能查询结果,但有时会花费几个小时也是同样的道理。因此是否优化SQL可能会出现访问1MB或访问10 GB的差别。如果访问10 GB,真的能在1s内从数据库中提取到结果吗?这是即使磁盘性能非常好且CPU非常多的最新系统也无法在线使用的SQL语句。此外,如果这样低效的执行SQL语句,不仅是该应用程序,包括在该系统上执行的所有应用程序都会被影响。

2)确认资源使用增加

资源使用增加会呈现多种现象。其中,由于未优化SQL而浪费的资源主要包括:CPU使用;内存使用;磁盘 I/O和空间。(www.chuimin.cn)

查看这些项目就能了解这意味着组成系统的大多数重要资源被浪费。未优化的SQL使CPU使用增加,导致CPU的平均使用率增加。CPU的平均使用率增高意味着什么?大多数企业将CPU使用率作为增设容量的标准值。增设容量指对相应系统增设 CPU、内存等。

那么未优化的SQL和容量增设之间有何关系?如果未优化的SQL较多,相应系统的CPU使用率增高,这种现象会导致CPU的平均使用率增加。在这种情况下,自然要计划增设系统的容量。如此增设容量是否为正确的处理方式?如果对未优化的SQL进行调优,则计划增设容量的许多企业都无须执行容量增设。如果不增设容量可以减少企业用于容量增设的费用,可将此费用用于促进企业发展的其他部分。因此,时常会因为未优化 SQL而导致公司费用的错误使用。

在许多地方仍然没有意识到这个事实,还在试图无条件地增设数据库系统的容量。现在就要准确判断是相应系统上执行的所有SQL已进行优化的前提下还需要增设容量的不可避免的情况,还是未优化SQL却要增设容量的情况。

这与内存使用量有何关系?大量数据排序的SQL或者大量访问数据块的未优化的SQL,可能会过量地使用内存。如果出现这种情况,则肯定会因为内存资源争用而出现性能下降的情况。

很容易因磁盘I/O和空间使用量或未优化的SQL而出现浪费。对于磁盘I/O,如果优化SQL,只需要访问100个数据块就能提取结果。但如果未优化SQL,可能要访问10000个数据块。此时,只优化相应SQL就足以将磁盘I/O减少至1%的水平。

如果有人对出现此类现象的原因有疑问,那肯定是还未充分理解 SQL。如果只提取数据库所需的数据,可通过多种方式访问SQL。在众多提取相同结果的方法中,有些方法要访问100个数据块,而有的方法则可能为提取相同结果而访问10000个数据块。就因为这种现象,才会因未优化的SQL而出现磁盘I/O增加的情况。那么磁盘空间使用又会如何?说到优化SQL,必定会提到索引。SQL的优化过程必然也涉及索引的优化。若未优化索引将出现哪些现象?也许表中会增加不必要的索引。索引是段,构成索引的数据实际上会保存到磁盘中。因此,过多不必要的索引会使磁盘空间使用率增加,造成磁盘空间因不必要的索引而浪费。

如前文所述,未优化的SQL会造成不必要的数据块访问和不必要的资源使用,从而降低性能。那么要如何创建SQL,才能消除此类不必要的数据块访问,并为了有效地使用资源而对SQL进行优化呢?本书随后将逐一介绍。