获得DB2企业应用程序的最佳性能
2007-05-20 16:15:40 来源:WEB开发网在 SQL 中 使用 WHERE 子句过滤数据 ,而不是在程序中到处使用它进行过滤。这也是新手容易犯的错误。在 DB2 将数据返回到程序之前,最好由 DB2 过滤数据。这是因为 DB2 使用附加 I/O 和 CPU 资源来获取每一行数据。传递到程序的行越少,SQL 的效率就越高:
SELECT EMPNO, LASTNAME, SALARYFROM EMPWHERE SALARY > 50000.00;
与只读取所有数据而不使用 WHERE 子句,然后在程序中检查 SALARY 是否大于 50000.00 的做法相比,该 SQL 更好。
使用参数化查询 。参数化 SQL 语句包含了变量,也称作参数(或参数标记)。典型的参数化查询使用这些参数来代替文字值,因此 WHERE 子句条件可以在运行时更改。通常程序被设计成最终用户可以在运行查询之前提供参数的值。这允许使用一个查询根据提供给参数的不同的值返回不同的结果。
参数化查询的主要性能好处是优化器可以制定在重复执行语句时能够再使用的存取路径。与每次 WHERE 子句中需要一个新值就发出一条全新的 SQL 语句相比,这可以给程序增加很大的性能收益。
但是,这些规则并不是 SQL 性能调优的最终和最高目标 - 决不是。您可能需要附加的、深入的调优。但遵循前面的规则将确保您不会犯降低应用程序性能的“新手”错误。
特定数据库应用程序开发技巧
无论您使用的是 Delphi、C++Builder 还是 Kylix,某些技巧和准则将帮助您确保在访问 DB2 数据时获得好的性能。例如,在某些情况下,使用 dbExpress TM来代替 ODBC/JDBC 或 ADO 可以提高查询性能。dbExpress 是用于从 Delphi(或 Borland Kylix™)处理动态 SQL 的跨平台接口。
要确保在您的应用程序中经常发出 COMMIT 语句。COMMIT 语句控制工作单元。发出 COMMIT 会将自上一个 COMMIT 语句之后的所有工作“永远”记录到数据库中。在发出 COMMIT 之前,可以使用 ROLLBACK 语句回滚工作。当修改数据(使用 INSERT、UPDATE 和 DELETE)但没有发出 COMMIT 时,DB2 将在数据上加一把锁并保持该锁 - 这把锁会使其它应用程序在等待检索被锁住的数据时超时。通过在工作完成时发出 COMMIT 语句,并且确保数据是正确的,就释放了该数据以供其它应用程序使用。
另外,构建应用程序时要考虑使用情况。例如,当某个特定查询返回几千行给最终用户时,要慎重处理。对于在程序和最终用户之间的在线交互,很少会用到几百行以上的数据。您可以在 SQL 语句上使用 FETCH FIRST nROWS ONLY 子句来限制返回到查询的数据量。例如,考虑以下查询:
SELECT EMPNO, LASTNAME, SALARYFROM EMPWHERE SALARY >
10000.00FETCH FIRST 200 ROWS ONLY;
该查询将只返回 200 行。如果有超过 200 行符合条件也没有关系;如果您尝试从查询中 FETCH(访存)超过 200 行,DB2 将用 +100 SQLCODE 表明数据结束。当您想要限制返回给程序的数据量时,这种方法很有用。
DB2 支持另一个名为 OPTIMIZE FOR nROWS 的子句,该子句不限制要返回给游标的行数,但从性能角度看可能是有帮助的。使用 OPTIMIZE FOR nROWS 子句告诉 DB2 如何处理 SQL 语句。例如:
SELECT EMPNO,LASTNAME,SALARYFROM EMPWHERE SALARY >
10000.00OPTIMIZE FOR 20 ROWS;
这告诉 DB2 尝试尽快访存前 20 行。如果您的 Delphi 应用程序在显示从数据库检索出来的数据行时每次显示 20 行,那么这将非常有用。
对于只读游标,使用 FOR READ ONLY 子句确保游标无歧义。Delphi 不能在 DB2 游标中执行位置更新,因此将 FOR READ ONLY 附加到每条 SELECT 语句后面可以使游标成为无歧义的只读游标,从而对 DB2 有所帮助。例如:
SELECT EMPNO,LASTNAME, SALARYFROM EMPWHERE SALARY > 10000.00FOR READ ONLY;
更多精彩
赞助商链接