SQL 编码准则
当您编写访问 DB2 数据的 SQL 语句时,要确保遵循以下三个编码 SQL 的准则以获得最佳性能。当然,SQL 性能是一个复杂的话题,而且了解 SQL 的执行方式的每一个细微差别可能要花一生的时间。但是,这些简单的规则可以使您进入开发高性能 DB2 应用程序的正轨。
第一条规则是始终在每条 SQL SELECT 语句的 SELECT 列表中只提供 确实需要检索的那些列 。另一种说法就是“不要使用 SELECT *”。简写 SELECT * 表示您要检索正在被访问的表中的所有列。这适用于“快捷但不恰当的方式获得的“(quick and dirty)查询,但却是应用程序的坏实践,因为:
DB2 表在将来可能需要更改,以包括附加列。SELECT * 也会检索那些新的列,而如果没有进行费时的更改,您的程序也许无法处理附加的数据。
DB2 将为被请求返回的每一列消耗附加资源。如果程序不需要数据,它就不会寻找它。即使程序需要每一列,最好根据 SQL 语句中的名称来显式地寻找每一列,以便增加清晰度和避免以前犯的错误。
不要寻找您已经知道的东西 。这听起来似乎显而易见,但大多数程序员都曾经违反过这条规则。举一个典型的示例,考虑以下 SQL 语句有什么错误:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE EMPNO = '000010';
放弃吗?问题是 EMPNO 已经包含在 SELECT 列表中。您已经知道了 EMPNO 将等于值“000010”,因为那就是 WHERE 子句要 DB2 做的事。但在 WHERE 子句中列出了 EMPNO,DB2 还会尽职地检索该列。这会产生附加开销,从而降低性能。
在 SQL 中 使用 WHERE 子句过滤数据 ,而不是在程序中到处使用它进行过滤。这也是新手容易犯的错误。在 DB2 将数据返回到程序之前,最好由 DB2 过滤数据。这是因为 DB2 使用附加 I/O 和 CPU 资源来获取每一行数据。传递到程序的行越少,SQL 的效率就越高:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE 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, SALARY
FROM EMP
WHERE SALARY > 10000.00
FETCH FIRST 200 ROWS ONLY;
该查询将只返回 200 行。如果有超过 200 行符合条件也没有关系;如果您尝试从查询中 FETCH(访存)超过 200 行,DB2 将用 +100 SQLCODE 表明数据结束。当您想要限制返回给程序的数据量时,这种方法很有用。
DB2 支持另一个名为 OPTIMIZE FOR nROWS 的子句,该子句不限制要返回给游标的行数,但从性能角度看可能是有帮助的。使用 OPTIMIZE FOR nROWS 子句告诉 DB2 如何处理 SQL 语句。例如:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE SALARY > 10000.00
OPTIMIZE FOR 20 ROWS;
这告诉 DB2 尝试尽快访存前 20 行。如果您的 Delphi 应用程序在显示从数据库检索出来的数据行时每次显示 20 行,那么这将非常有用。
对于只读游标,使用 FOR READ ONLY 子句确保游标无歧义。Delphi 不能在 DB2 游标中执行位置更新,因此将 FOR READ ONLY 附加到每条 SELECT 语句后面可以使游标成为无歧义的只读游标,从而对 DB2 有所帮助。例如:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE SALARY > 10000.00
FOR READ ONLY;
结束语
了解 SQL 编码以获得最佳性能的基础知识将使您的 Delphi 企业应用程序的性能立即得到增长。但我只揭露了冰山一角。您需要学习日益增多的 SQL 的复杂类型,包括连接、子选择和联合等。您还需要学习如何最好地编写这些 SQL 语句以及如何发现 DB2 选择的存取路径来满足您的 SQL 请求。确实,还有许多要学习。但是您已经学习了一些如何最大限度地利用 DB2 SQL 的初步知识,尽情地享用这些知识吧。
分享到:
相关推荐
### DB2数据库基础学习 #### 一、DB2数据库概览 DB2是IBM公司开发的一款关系型数据库管理系统,自1983年发布以来,不断进化,支持多种平台,包括Windows、Linux、Unix和z/OS等。DB2不仅提供高性能的数据存储和检索...
DB2 数据库导入导出 DB2 数据库导入导出的操作方法是指将用户的 DB2 数据库导出并导入到自己的 DB2 数据库上。由于 DB2 没有直接的数据库导出功能,因此需要导出表结构、表数据,然后在导入。 一、导出表结构 在 ...
在讨论DB2数据库设计时,不能不提的是程序编码逻辑和SQL语句质量。一个良好的设计不仅仅是逻辑上无懈可击,还需要具备高效的执行效率。数据库设计的好坏直接关系到程序的性能,因此在设计阶段就需要对性能有所考虑。...
在本例中,"JDBC连接db2数据库.zip"是一个压缩包,包含了连接IBM DB2数据库所需的JDBC驱动。 DB2是IBM公司开发的一款关系型数据库管理系统,广泛应用于企业级应用,支持多种操作系统平台,如Windows、Linux、Unix和...
在Java编程环境中,如果要与DB2数据库进行交互,通常需要引入特定的JDBC驱动,也就是DB2的jar包。本资源提供的两个jar包可能包含了DB2的JDBC驱动,它们是连接DB2数据库所必需的库文件。 1. **JDBC驱动介绍**:Java ...
以下是对给定文件中提到的DB2数据库管理相关知识点的详细解释。 #### 1. 查看节点目录 `db2listnodedirectory` 该命令用于列出系统中所有已注册的节点。节点目录提供了关于网络中所有可用DB2实例的信息,包括节点...
在逆向工程之前,你需要在DB2数据库中执行这个SQL脚本来创建表。 接下来,执行逆向工程的步骤如下: 1. 在Java项目中引入Mybatis Generator的依赖。 2. 配置`mybatisGenerator_db2.xml`,确保数据库连接信息正确。...
DB2数据库协议解析-DRDA V5.3 在数据库领域,分布式关系数据库访问架构(Distributed Relational Database Architecture,简称DRDA)是一种标准通信协议,由IBM开发,用于连接不同系统上的数据库管理系统(DBMS)。...
这些驱动程序使得开发者能够在Java环境中执行SQL查询,进行数据操作和管理DB2数据库。在本篇中,我们将详细探讨Java连接DB2数据库所需的驱动包以及如何使用它们。 1. **Java Database Connectivity (JDBC)**: JDBC...
### DB2 SQL 数据库函数详解 #### 一、概述 DB2是一款由IBM开发的关系型数据库管理系统(RDBMS),广泛应用于各种规模的企业级环境中。它提供了丰富的SQL函数,用于处理数据,包括数学运算、字符串操作、日期时间处理...
DB2-SQL数据库函数是IBM DB2数据库管理系统中的一系列内置操作工具,用于处理数据的各种需求,包括数学计算、字符串操作、日期时间处理等。这些函数不仅能够简化SQL查询语句,提高数据处理效率,还能确保数据的准确...
`db2 -tvf <脚本名称>.sql` 可导入之前导出的表结构,`db2move <数据库名> load -lo replace` 用于加载数据并替换原有数据。 10. **查看表结构和表**: `db2 describe table <表名>` 显示表结构,`db2 list ...
下面我们将详细探讨如何从DB2数据库将表导入到MySQL中,并在MyEclipse环境中进行操作。 首先,了解DB2和MySQL的基础是至关重要的。DB2是由IBM开发的一款关系型数据库管理系统,广泛应用于大型企业,支持复杂的事务...
在DB2数据库管理中,SQLCode扮演着至关重要的角色,它是DB2处理SQL语句后返回的一个整数值,用于指示SQL语句执行的结果。SQLCode可以是正值、零或负值,分别表示警告、成功和错误。了解和解读SQLCode对于诊断和解决...
### DB2数据库运维常用命令详解 #### 一、常识性命令 DB2作为IBM的一款高性能关系型数据库管理系统,在企业级应用中占据着重要的地位。为了更高效地管理和维护DB2数据库,掌握一些基本且常用的运维命令是十分必要的...
其中,存储过程是DB2中一个非常重要的特性,它允许开发者在数据库内编写可重用的代码块,这些代码块可以接受输入参数、返回输出参数并执行复杂的SQL操作。本文将详细介绍DB2 SQL存储过程的基本语法及其关键组成部分...
为了更高效地管理和操作DB2数据库,选择一款功能强大的SQL编辑软件至关重要。本文将重点推荐并详细介绍一款能够支持DB2的SQL编辑软件,并探讨其关键特性和优势。 标题提及的“推荐一款支持DB2的sql编辑软件”,这...
【AIX和Windows下DB2数据库互导】的知识点涵盖了多个方面,主要涉及数据库的备份、迁移、数据抽取、DDL创建、数据加载以及外键和索引的建立。以下是详细说明: 1. **数据备份与恢复**:在AIX环境下,DB2数据库可以...
在Java中,通过JDBC驱动程序,开发者可以编写代码来执行SQL语句,操作DB2数据库。本主题将深入讲解关于“JAVA数据库驱动 DB2 JDBC驱动”的相关知识点。 1. **JDBC概述** - JDBC(Java Database Connectivity)是...