《SQL编码优化基础教程》由会员分享,可在线阅读,更多相关《SQL编码优化基础教程(5页珍藏版)》请在金锄头文库上搜索。
1、当要保证用IBM DB2 Universal Database(DB2 UDB)和Borland工具(如 Delphi、C+Builder或Kylix)构建的企业应用程序拥有最优性能时,程序员可以利用 DB2 优化器的能力来处理即使是“难以处理的”SQL 语句并给出有效的存取路径。尽管如此,拙劣编码的 SQL 和应用程序代码仍可能给您带来性能问题,通过学习几条基本准则可以轻易地避免这些问题。我将向您演示 DB2 优化器的工作方式,并提供编写能发挥优化器最大效率的 SQL 的准则。但即使拥有了 DB2 的优化能力,编写有效的SQL语句仍可能是一件复杂的事情。如果程序员和开发人员还不熟悉关系数据库
2、环境,这件事就尤其显得 。 此, 我 编码SQL以 得最 性能的 , 一些时 来 SQL 基 。 基 SQL 过程化语 不 , 提供了 的 , 此 可以程序员力currency1 “要 的数据,fi不是 如fl 数据。您不使用 式数据 来编码 SQL。DB2 ” SQL,并“ ” 数据 。这些数据 作 存取路径。 DBMS currency1数据的最优存取路径了程序员的。此 ,数据库可以 地理 存的数据的 ,fi可以currency1数据的 有效和 的存取路径。其 果就是 当使用的 SQL 可以用 的应用程序开发。 一 SQL 性是 不 是一 语 。您还可以使用 来 数据 构; 数据的 问;以
3、 、和 数据的发。通过提供一 语 ,SQL 化了 DBA、系程序员、应用程序员、系”员和最用 的通。当 的 有 使用 一 语 时, 建 来的 作就可以 系开发时 。 证,保证 SQL 的最要的一 性就是 使用 语的语法轻松地 数据的能力。理这 语 比理数据页面的 构和程序源代码要容易得多: SELECT LASTNAME FROM EMP WHERE EMPNO = 000010; 想想看:当 问文件的数据时,程序员须编码来打开文件、开始一 循环、读取记录、 EMPNO 字段是否等 当的值、 文件 尾、 currency1循环的开头等。 SQL 本来就是非常灵活的。 使用自 格式的 构,该 构
4、可以用开发 SQL 语句来 合 的“要。DBMS 执行 ”每 SQL 请求,以 语法是否正 和优化该请求。SQL 语句不“要任fl给 的列开始,您可以将 串 一行,或 拆几行。例如,以下这条单行的 SQL 语句 我 面使用的三行示例等价: SELECT LASTNAME FROM EMP WHERE EMPNO = 000010; SQL 的 一 灵活 性是您可以用许多形式不 但 能等价的方法来 一 请求。例如:SQL 可以连接表或套 。您始可以将套 转换等价的连接。您可以 大量的函数和谓词看currency1这一灵活性的其 示例。具有等价 能的 性的示例包括: BETWEEN vs = IN
5、 vs 一系列和 OR 配合的谓词 INNER JOIN vs FROM 子句串 一 并用逗号隔的表 OUTER JOIN vs 带有 UNION 的 单 SELECT 和相关的子 CASE 表达式 vs 复杂的 UNION ALL 语句 SQL 展示的这一灵活性并不总是称心的, 为形式不 但 能等价的 SQL 式可以提供非常不 的性能。我将 本文的以部讨论该灵活性 造的 果,并提供开发有效的 SQL 的准则。 如我 说的,SQL 了要 或操作数据,但没有 数据库如fl完这些任务。这就使 SQL 本身变得很 单。如果您能够记得关系数据库的一次处理一 合(set-at-a-time)的 点,您就
6、开始掌握 SQL 的本质和性质了。一条 SQL 语句可以作用 多行。作用 一组数据fi不“要建 如fl 和操作数据的能力将 SQL 非过程化语 为 SQL 是一 非过程化语 , 以一条语句可以代替一系列过程。 , SQL 使用合的处理以 DB2 优化 来 数据 逻辑, 以这是可能的。有时,如果不使用 SQL 语句,一条或两条 SQL语句可以完的任务就“要完 的过程化程序来完。 优化器 优化器是 DB2 的心脏和灵魂。 ” SQL 语句并 可以满足每条语句的最有效的存取路径(请 阅图 1)。DB2 UDB 通过” SQL 语句来 须 问哪些表和列,fi完该操作。DB2 优化器然 存 DB2 系
7、录的系息和计息,以 完满足 SQL 请求 “的任务的最 方法。 优化器 能等价 一 专家系。专家系是一 标准规则合,当 情境数据组合时, 返 一 “专家”意见。例如,医学专家系采用一 规则合,用来 哪些药可以用 哪些疾病,将规则 描述疾病症 的数据组合,并将 库应用 输 症 的列表。DB2 优化器根据存 DB2 系 录的情境数据和 SQL 格式的 输 来 数据 方法的专家意见。 DBMS 优化数据 问的概念是 DB2 最 大的能力 一。请记 ,您 问 DB2 数据时应 DB2 要,fi不是如fl 。 论数据 是如fl存和操作的,DB2 和 SQL 可以 问该数据。 理存 出 问标准作 理数据
8、性。DB2 的优化器是完该 理数据 性的组件。 如果您不要 ,DB2 仍然能够 问数据(尽管效率 )。如果将一列 currency1正 问的表,DB2 仍然可以 不 程序代码的情 下操作数据。 为currency1 DB2 数据的 理存取路径并不是 程序员 应用程序编码的,fi是 DB2 的, 以这 情 是完 有可能发的。 这 点 非 DBMS 系非常不 , 系,程序员须 数据的 理 构。如果有 ,程序员就须编写 当的代码来使用该 。如果 人 了 ,程序就不能工作,非程序员 行 。fi使用DB2 和 SQL 就不如此。这一灵活性完 DB2 自 优化数据操作请求的能力。 优化器根据许多息执行复杂
9、的计 。要使优化器的工作方式 化,可以将优化器想 执行一 的过程: 1、接 并 证 SQL 语句的语法。 2、”环境并优化满足 SQL 语句的方法。 3、 建计 可读来执行优化的 SQL。 4、执行或存 以将来执行。 这 过程的 是最有的。优化器 如fl以 的方式执行您可以发currency1的大量 SQL 语句? 优化器有许多 的优化 SQL 的“。 如fl 优化存取路径使用这些“的哪一 ?IBM 并没有发fi优化器如fl 最 存取路径的fl正和 的 息,但优化器是一 基 本的优化器。这意优化器将始为每 总本的存取路径。要 这 标,DB2 优化器应用 本式,该 式 每条可能的存取路径的 行和
10、”:CPU 本、I/O 本、DB2 系 录的计息和 的 SQL 语句。 性能准则 此,要记 关 DB2 优化器的息,您就可以 这些准则以 得 的 SQL 性能: 1) 使 DB2 计息保最 :如果没有存 DB2 系 录的计息,优化器 优化任fl事 时 currency1难。这些计息向优化器提供了 正 优化的 SQL 语句将要 问的表 相关的息。存 系 录的计息的 包括: 关 表的息,包括总的行数、关 的息和总页数; 关 列的息,包括列的 值的数量和存 列的值的fi; 关 表 的息,包括活 页面的数量; 的当 ,包括是否存 、 的组(子页的数量和的数量)、 的 值的数量以是否 ; 关 表 和 点
11、组或的息。 当执行 RUNSTATS 或 RUN STATISTICS 用程序时,计息就 DB2 系 录。您可以 心(Control Center)、处理作业或通过使用行处理器来用该 用程序。一 要 您的 DBA 一工作以 保 当的时 计息,尤其是 环境。 2) 构建 当的 : 许您为保证最 DB2 应用程序性能fi可以 的最要的事就是根据应用程序使用的 为您的表 建正 的 。当然,说总比 容易。但我 可以一些基 开始。例如, 以下这条SQL 语句: SELECT LASTNAME, SALARY FROM EMP WHERE EMPNO = 000010 AND DEPTNO = D01 这
12、 单 有作用? , 您可以 建的 有可能的 。您的一 列表可能看 来如下: EMPNO 的 Index1 DEPTNO 的 Index2 EMPNO 和 DEPTNO 的 Index3 这是一 的开始,Index3 可能是最的。 DB2 使用 来 即 满足 WHERE 子句的两 单谓词的行。当然,如果您 有许多关 EMP 表的 ,您 许应该 建 一 关 表的 带来的 。要 的 包括: :DB2 将自 您 建的每 。这表示 该表的每 INSERT 和每 DELETE 将不 表 和 ,fi 其 和 。如果您 的列的值 行 UPDATE 操作, 您还 了该 。 此 了 过程的 ,但 了 的 。 有
13、的列 :如果 EMPNO 或 DEPTNO 有了一 , 建 一 关 该组合的 许并不 。但是, 一 以 的列 许可以 作用。但 不一 , 为 列的序 许根据 fi有很大。例如, 以下 : SELECT LASTNAME, SALARY FROM EMP WHERE EMPNO = 000010 AND DEPTNO D01; 这 情 下, 应该 列出 EMPNO。然列出 DEPTNO,fi 许 DB2 一列(EMPNO)执行接 ,然 大 号 描列(DEPTNO)。 fi ,如果 存 关 这两列的 (一 关 EMPNO,一 关 DEPTNO),DB2 可以使用 来满足该 , 此 建 一 许是没有
14、要的。这 的要性 : 要, 您可能就 应该通过 建 来 行优。如果您正 编码 CIO要每 行的 , 您应该 保 提供最 性能。 此,为该 构建 是很要的。 , 员的 许就没有要看得 , 以 许应该利用 有 来执行 。当然, 取 应用程序 业务的要性 - fi不是用的要性。 计 的 容比currency1 为 我 讨论的要多得多。例如,您 许要 以 问(index-only access)。如果 SQL 要 的 有数据包 , DB2 许使用 就可以满足该请求。请 我 面的 SQL 语句。给 了关 EMPNO 和 DEPTNO 的息,我 要 LASTNAME 和 SALARY。我 还 建关 EMPNO 和 DEPTNO 列的 开始。如果我 还包了 LASTNAME 和 SALARY,我 就不 “要 问 EMP 表, 为我 “要的 有数据 。该可以大大提 性能, 为 了 I/O 请求的数量。 请记 :使每 为