`
燕子~~
  • 浏览: 107426 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

DB2数据库SQL编码优化基础

阅读更多

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 的初步知识,尽情地享用这些知识吧。

分享到:
评论

相关推荐

    数据库学习入门数据库基础入门.docx

    本文档主要介绍了数据库的基础知识和入门教程,涵盖了数据库的基本概念、常用的DBMS、数据操作语言、数据库管理系统、数据库优化、备份和恢复机制等方面的知识。 一、数据库的基本概念 数据库是存储和管理数据的...

    db2 常用命令大全

    db2look -d <数据库名> -u <用户> -e -o <脚本名称>.sql -- 导出数据库的表结构 db2look -d <数据库名> -u <用户> -t <表 1> <表 2> -e -o <脚本名称>.sql -- 导出数据库中表 1 和表 2 的表结构 db2move <数据库名> ...

    数据库学习入门数据库基础.doc

    数据库学习入门数据库基础 本文档旨在为读者提供数据库学习的入门知识,涵盖了数据库的基本概念、DBMS 的种类、SQL 语言的分类、数据库管理系统的学习方法、MYSQL 的安装与配置、基本的 SQL 语句等。 一、数据库的...

    通用的固定长度编码格式的字符串查找算法的实现

    字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE、DB2、SYBASE、MS SQL SERVER、MYSQL等等)也都提供了对应的字符串处理函数,比如DB2的LOCATE函数。 但在实际的工作中,还是会遇到一些特殊...

    db2中常用的命令大全

    8. 数据库导出:db2look -d <数据库名> -u <用户> -e -o <脚本名称>.sql --导出数据库的表结构 db2look -d <数据库名> -u <用户> -t <表 1> <表 2> -e -o <脚本名称>.sql --导出数据库中表 1 和表 2 的表结构 db2...

    db2常用命令大全.docx

    "DB2 命令大全" DB2 是 IBM 公司开发的一款关系型数据库管理...这些命令涵盖了 DB2 数据库的连接、备份、导出、导入、查看表结构、修改页编码等多个方面,从基础到高级,都是开发人员在实际项目开发中不可或缺的工具。

    2018年7月最新最完整MySQL SQLServer DB2全国省市区数据省市区县三级联动数据库-行政区划数据库-经纬度-省市区-邮编-区号-拼音-简称

    2018年7月最新最完整MySQL SQLServer DB2全国省市区数据省市区县三级联动数据库-行政区划数据库-经纬度-省市区-邮编-区号-拼音-简称

    数据库系统-招标参数---模板.doc

    满足从不同" " " "主流数据源(例如:SQLServer、Oracle、DB2、Sy" " " "base、Excel、文本、SAP等等)抽取、转换、加载" " " "到不同数据源(例如:SQLServer、Oracle、DB2、" " " "Sybase、Excel、文本、SAP等等)...

    Sqlite3数据库支持库2.0#2版(静态版)

    相对于其它非本地数据库,如Oracle、DB2、MS SQL Server、MySQL、PostgreSQL,Sqlite数据库具有小巧、速度快的优势。目前使用的Sqlite版本是3.6.11,只要有可能,将随时跟踪并升级至Sqlite最新版本。数据库内部文本...

    SqlDbx 5.11专业版-无任何功能限制(中文版)

    SqlDbx是一款非常实用的数据库管理工具。支持SQL的编辑与查询,支持自动语法突显,能够智能化完成操作,内置多种丰富的特色功能。支持的数据源有MSSQL/MYSQL/ODBC/DB2/ASE/SYBASE/ORACLE/PostgreSQL/Sqlite等数据源...

    常用数据库管理系统简介.docx

    DB2数据库系统采用多进程多线索体系结构,可以运行于多种操作系统之上,并分别根据 相应平台环境作了调整和优化,以便能够达到较好的性能。 DB2目前支持从PC到UNIX, 从中小型机到大型机,从 旧M至归E旧M (HP及SUN ...

    SqlDbx 5.11汉化专业版 已和谐版

    SqlDbx是一款非常实用的数据库管理工具,支持SQL的编辑与查询,支持自动语法突显,能够智能化完成操作,内置多种丰富的特色功能。支持的数据源有MSSQL/MYSQL/ODBC/DB2/ASE/SYBASE/ORACLE等数据源。能够同时操作打开...

    SqlDbx_5.11_Unicode_Zh-Cn 中文破解最新版

    SqlDbx是一款非常实用的数据库管理工具,支持SQL的编辑与查询,支持自动语法突显,能够智能化完成操作,内置多种丰富的特色功能。支持的数据源有MSSQL/MYSQL/ODBC/DB2/ASE/SYBASE/ORACLE等数据源。能够同时操作打开...

    汉化SqlDbx 5.11 和谐版

    SqlDbx是一款非常实用的数据库管理工具,支持SQL的编辑与查询,支持自动语法突显,能够智能化完成操作,内置多种丰富的特色功能。支持的数据源有MSSQL/MYSQL/ODBC/DB2/ASE/SYBASE/ORACLE等数据源。能够同时操作打开...

    自动生成32位UUID的函数

    直接通过 dbo.[FunGetUUID32](NEWID())即可获取到32位UUID,非常简单方便。

    SqlDbx 5.1 专业版

    SqlDbx是一款非常实用的数据库管理工具,支持SQL的编辑与查询,支持自动语法突显,能够智能化完成操作,内置多种丰富的特色功能。支持的数据源有MSSQL/MYSQL/ODBC/DB2/ASE/SYBASE/ORACLE等数据源。能够同时操作打开...

    功能超强大完整博客源代码(ASP.NET2.0+Access or SQL Server)

    使用.net2.0编写,编码结构为N-Tige模式,数据库引擎采用了Nhibernate,可以支持当前流行的几乎所有数据库,包括SQLSERVER2000\SQLSERVER2005\ORACLE\MYSQL\DB2\ACCESS等,但是在默认情况下,我使用了ACCESS作为默认...

    JDBC数据库操作乱码无缝过渡解决方案

    proxy.encoding= (可选)实际连接到的数据库所使用的编码,指定该参数后,所有的对于该数 据库的访问操作所产生或获得的字符串将被使用该编码进行转码,该动作是被多个代理程序包装, 并很好的隐藏的,你不必...

    图书管理系统数据库实验报告.doc

    1. 在DBMS(如SQL Server,DB2等)上完成完整的数据库的设计; 2. 使用可视化开发平台完成该系统,并要可以求正确的运行; 3. 完成实验报告。 五、 考核方式 1. 在微机上检查数据库设计的模式的设计、完整性的设计等...

Global site tag (gtag.js) - Google Analytics