DB2静态SQL和动态SQL 的比较与实践

引言 

SQL 语言作为标准的查询语言,几乎被所有的数据库管理系统 (DBMS) 所支持,并成为国际标准。标准的 SQL 语言一般包括三类,即 DDL (Data Definition Language, 数据描述语言 ) 、DML (Data Manipulation Language, 数据操纵语言 ) 和 DCL(Data Control Language,数据控制语言 )。通过这些标准的 SQL 语句,使得各种数据库能以一种较为统一的方式被访问。

DB2(本文以下专指 DB2 UDB for LinuxUnix和 Windows 版本)允许用户通过多种编程接口发送 SQL 语句到数据库引擎,然后由引擎统一编译并且运行。SQL 语句从编译和运行的角度可以分为两种,静态 SQL和 动态 SQL,这两种 SQL 在使用方式、运行机制和性能表现等方面各有特点 :

静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。

动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。

表 1列举了静态 SQL 和动态 SQL 的比较结果。

表 1. 静态 SQL 和动态 SQL 的比较

静态 SQL动态 SQLSQL 语句直接嵌入到宿主编程语言,程序需要预编译处理这些嵌入的 SQL 语句SQL 语句一般作为宿主语言的变量出现。嵌入式动态 SQL 应用需要预编译,非嵌入式 SQL 应用则无需预编译SQL 语句在程序被编译时已知,涉及的数据库对象已存在SQL 语句在程序被编译时未知,涉及的数据库对象可以是运行时才创建的SQL 语句在程序运行前被编译SQL 语句在程序运行时被编译SQL 语句的编译结果在 DB2 的目录 (catalog) 中持久化保存SQL 语句的编译结果缓存在数据库的内存里运行时仅读取目录 (catalog)运行时编译 SQL 语句需对目录 (catalog) 加锁SQL 语句的优化是根据编译时的数据库统计信息进行的,不能完全反映运行时的情况SQL 语句的优化是根运行时的数据库统计信息进行的对 SQL 语句所访问的数据对象的权限检查是在绑定时进行的对 SQL 语句所访问的数据对象的权限检查是在运行时进行的权限控制的粒度是包(package,一组 SQL 语句的编译结果)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值