欢迎来到Java学习网!
设为首页 | 加入收藏
当前位置: 首页 > 数据库 > 数据库综合 >

  当要保证用IBMDB2UniversalDatabase(DB2UDB)和Borland工具(如Delphi、C Builder或Kylix)构建的企业应用程序拥有最优性能时,程序员可以利用DB2优化器的能力来处理即使是“难以处理的”SQL语句并给出有效的存取路径。尽管如此,拙劣编码的SQL和应用程序代码仍可能给您带来性能问题,通过学习几条基本准则可以轻易地避免这些问题。我将向您演示DB2优化器的工作方式,并提供编写能发挥优化器最大效率的SQL的准则。但即使拥有了DB2的优化能力,编写有效的SQL语句仍可能是一件复杂的事情。如果程序员和开发人员还不熟悉关系数据库环境,这件事就尤其显得棘手。因此,在我们深入研究编码SQL以获得最佳性能的细节之前,先花一些时间来回顾SQL基础知识。

  基础知识

  由于SQL与过程化语言不同,它提供了更高的抽象级别,因此它可以让程序员把精力集中到他们需要什么样的数据,而不是如何检索数据。您不必使用嵌入式数据导航指令来编码SQL。DB2会分析SQL,并“在幕后”制定数据导航指令。这些数据导航指令叫作存取路径。让DBMS确定到数据的最优存取路径解除了程序员肩上沉重的负担。此外,数据库可以更好地理解它存储的数据的状态,从而可以生成到数据的更有效和动态的存取路径。其结果就是适当使用的SQL可以用于更快的应用程序开发。

  另一个SQL特性是它不仅仅是一种查询语言。您还可以使用它来定义数据结构;控制对数据的访问;以及插入、修改和删除数据的发生。通过提供一种公共语言,SQL简化了DBA、系统程序员、应用程序员、系统分析员和最终用户之间的通信。当项目的所有参与者都使用同一种语言时,他们之间所建立起来的协作就可以减少整体系统开发时间。

  历史证明,保证SQL成功的最重要的一个特性就是它使用类似英语的语法轻松地检索数据的能力。理解这种语言比理解数据页面的结构和程序源代码要容易得多:

  SELECTLASTNAME

  FROMEMP

  WHEREEMPNO=’000010’;

  想想看:当访问文件中的数据时,程序员必须编码指令来打开文件、开始一个循环、读取记录、检查EMPNO字段是否等于适当的值、检查文件结尾、回到循环的开头等。

  SQL本来就是非常灵活的。它使用自由格式的结构,该结构可以让用户开发SQL语句来适合他们的需要。DBMS在执行之前会分析每个SQL请求,以检查语法是否正确和优化该请求。SQL语句不需要从任何给定的列中开始,您可以将它们串在一行中,或者把它们拆成几行。例如,以下这条单行的SQL语句与我前面使用的三行示例等价:

  SELECTLASTNAMEFROMEMPWHEREEMPNO=’000010’;

  SQL的另一个灵活特性是您可以用许多形式不同但功能等价的方法来制定一个请求。例如:SQL可以连接表或嵌套查询。您始终可以将嵌套查询转换成等价的连接。您可以在大量的函数和谓词中看到这一灵活性的其它示例。具有等价功能的特性的示例包括:

  BETWEENvs<=/>=

  INvs一系列和OR配合的谓词

  INNERJOINvsFROM子句中串在一起并用逗号分隔的表

  OUTERJOINvs带有UNION的简单SELECT和相关的子查询

  CASE表达式vs复杂的UNIONALL语句

  SQL展示的这一灵活性并不总是称心的,因为形式不同但功能等价的SQL公式可以提供非常不同的性能。我将在本文的以后部分讨论该灵活性所造成的结果,并提供开发有效的SQL的准则。

  如我所说的,SQL指定了要检索或操作什么数据,但没有指定数据库如何完成这些任务。这就使SQL本身变得很简单。如果您能够记得关系数据库的一次处理一个集合(set-at-a-time)的特点,您就开始掌握SQL的本质和性质了。一条SQL语句可以作用于多行。作用于一组数据而不需要建立如何检索和操作数据的能力将SQL定义成非过程化语言

  因为SQL是一种非过程化语言,所以一条语句可以代替一系列过程。同样,由于SQL使用集合级别的处理以及DB2优化查询来确定数据导航逻辑,所以这是可能的。有时,如果不使用SQL语句,一条或两条SQL语句可以完成的任务就需要完整的过程化程序来完成。

    相关教程
    推荐内容