DB2绩效顾问
DB2

DB2绩效顾问–SQL性能调整基础知识

当被问及他们工作的最重要或最有压力的方面是什么时候,DBA通常响应“确保最佳性能”。实际上,对关键的DBA问题的Forrester研究调查表明,性能和故障排除最具挑战性DBA任务的列表。考虑到这一点,让我们花点时间概述影响DB2应用程序性能的基本因素。

尽管对DB2性能问题的适当调查可能会以数据库设计开头,但是让我们开始讨论SQL,因为它会影响更多用户。需要访问或修改DB2数据库中数据的每个人都将使用SQL完成任务。

当您编写SQL语句来访问DB2数据时,有一些非常简单,但重要的规则是为了促进高效的SQL。当然,SQL性能是一个复杂的主题,要了解SQL Devalls如何终身掌握的每个细微差别。据说,遵守几个简单的规则可以让您在正确的轨道上实现高性能的DB2应用程序。

第一个规则是始终只提供在每个SQL选择语句的选择列表中检索的确切列。如果你只需要三列,为什么要询问更多?您请求的每一个列必须被DB2从数据库存储到程序访问和移动。

大多数DB2开发人员已经听过标准建议:“请勿使用SELECT *”。这是许多商店的常见标准,这是一个很好的标准......但它不够远。对于那些不知道的人来说,选择*是告诉DB2检索来自所访问的表的所有列的简写意味着。它可以节省一段时间的SQL编码器,但在生产应用程序中指定SELECT *不是一个好主意,因为:

  • DB2表可能需要在将来更改以包括附加列。选择*也将检索这些新列,您的程序可能无法处理附加数据而不需要耗时的更改。如果您只需指定所需的列,则可以在不受影响的生产应用程序时添加列。
  • DB2将为您要求返回的每列消耗其他资源。如果程序不需要数据,则不应该要求它。即使该程序需要每列,最好在SQL语句中以CLINATITY在SQL语句中的名称明确代码每个列,并避免上一个陷阱。

所以选择*对于快速和肮脏的查询很好,但使用它是包含在应用程序中的不良做法。

要记住的第二条规则是你不应该用你的SQL代码要求你已经知道的东西。这似乎是简单的建议和易于理解的,但大多数程序员一次违反了这条规则。对于典型示例,请考虑以下SQL语句:

选择empno,lastname,薪水
来自EMP.
其中empno =‘000010’

乍一看这个SQL看起来很好。它非常简单,并且在empno列上索引查询应该表现良好。但它要求您已经知道的信息,并应该重新编码。

问题是EMPNO包含在“选择列表中”。您已经知道EMPNO将等于该价值‘000010’因为这就是Where子句告诉DB2。 DB2无法将员工与任何其他号码返回。但是,使用empno列出的empno,db2将尽职尽责地检索该列。这导致额外的开销从此产生降低性能。开销可能是最小的,但如果相同的SQL语句每天运行数百,数千次,那么最小的性能影响可能会增加显着影响。

您可以调用第三条规则的另一个指导原则是您应该访问像关系数据库系统中的DB2数据,而不是在平面文件中。一个常见的新秀错误,特别是对于旧的大型机程序员来说,是不一致的。

例如,您应该始终使用WHERE子句来过滤SQL中的数据,而不是将其带入程序,并使用if-wess语句过滤它。从性能角度来看,DB2更好的是在将数据返回到程序之前过滤数据。这是因为DB2使用额外的I / O和CPU资源来获得每行数据。传递给您的程序的行越少,SQL的效率越高。所以,以下SQL

选择empno,lastname,薪水
来自EMP.
薪水在哪里> 50000.00;

...优于简单地阅读没有WHERE子句的所有数据,然后检查每行,以查看节目中的工资是否大于50000.00。当然,这是一个简单的例子。它通常在具有多个谓词和加入条款的更复杂的SQL语句中,使程序员切换到其COBOL或Java中的过滤,而不是使用已复杂的SQL语句进行修改。但是正确的方法是在SQL中过滤,而不是在您的程序中。

另一种方法是程序员编写SQL以访问DB2表,如平面文件是避免连接。 DB2不设计用于模拟QSAM文件的旧主文件处理策略。通过此,我的意思是从文件读取记录,然后使用该记录的值从现有文件中读取读取。 DB2程序员尝试使用两个游标模拟此类处理:一个要读取行,另一个使用值来驱动下一个光标。这是表现不佳的配方。相反,将SQL作为加入代码,让DB2为您完成工作。

最后,请记住第四条规则是您应该将尽可能多的工作放入SQL,让DB2优化您的访问路径。通过适当的统计信息和适当的SQL编码,DB2几乎总是将制定更高效的访问路径以访问数据,而不是您可以在您的程序中代码的数据。是的,代码将更加复杂 - 您需要将其考虑到您的决策过程 - 但从性能角度来看,让SQL执行工作!

结论

本文中的规则和想法可用于创建一组用于编写SQL以访问DB2数据的哲学指导原则。不,我无法保证如果您遵循它们,我就不会有任何表现问题,但我可以明确向您保证您将尽量减少自我危害的问题。

因此,这些规则虽然它们不是全部/最终所有SQL性能调整,但可以在正确的路径上设置。在某些时候可能需要额外的深入调谐。但在上述规则之后,将确保您无法制作“新秀”错误,可以杀死DB2应用程序的表现。

克雷格穆林斯
跟着我
克雷格穆林斯的最新帖子 (查看全部)
分享这篇文章: 在脸书上分享
Facebook
0在Twitter上推文
推特
分享LinkedIn.
linkedin
向某人发送电子邮件
电子邮件

这篇文章有一个评论

  1. 头像
    罗伯特巴恩斯 回复

    克雷格,谢谢你这个有趣的文章。我在早期的产品Manasys中实施了大多数性能规则,以便编程师才会写作
    COPY TableName;
    过程Tablename在哪里(条件);

    如果桌面是SQL表,则Manasys将弄清楚程序中实际使用的字段,并使用适当的数据列表生成选择。当然,如果TablEname是VSAM记录,它将得到整个记录,并使用键控访问和过滤的组合来实现在哪里。但是,我’D没想到你的第二条规则,没有要求我们已经知道的东西。

    在新产品中执行SQL,Manasys Jazz(见http:// http://www.jazzsoftware.co.nz)将遵循相同的原则,但我’LL可以在可能的情况下包括此额外规则。谢谢你把它带到我的注意力。

    罗伯特巴恩斯,
    爵士软件有限公司首席执行官,
    奥克兰,新西兰

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *