1、动态Sql 和静态Sql
静态Sql:在编译阶段已经知道数据库要执行什么操作。(注意:如果SQL的结构已经确定,数据库是可以将它编译的,在执行阶段只需将个别参数的值补充进来即可。也是静态Sql)
动态Sql:在程序运行的过程中才知道要执行什么操作。
静态 SQL | 动态 SQL |
---|---|
SQL 语句直接嵌入到宿主编程语言,程序需要预编译处理这些嵌入的 SQL 语句 | SQL 语句一般作为宿主语言的变量出现。嵌入式动态 SQL 应用需要预编译,非嵌入式 SQL 应用则无需预编译 |
SQL 语句在程序被编译时已知,涉及的数据库对象已存在 | SQL 语句在程序被编译时未知,涉及的数据库对象可以是运行时才创建的 |
SQL 语句在程序运行前被编译 | SQL 语句在程序运行时被编译 |
SQL 语句的编译结果在 DB2 的目录 (catalog) 中持久化保存 | SQL 语句的编译结果缓存在数据库的内存里 |
运行时仅读取目录 (catalog) | 运行时编译 SQL 语句需对目录 (catalog) 加锁 |
SQL 语句的优化是根据编译时的数据库统计信息进行的,不能完全反映运行时的情况 | SQL 语句的优化是根运行时的数据库统计信息进行的 |
对 SQL 语句所访问的数据对象的权限检查是在绑定时进行的 | 对 SQL 语句所访问的数据对象的权限检查是在运行时进行的 |
权限控制的粒度是包(package,一组 SQL 语句的编译结果),用户仅需要访问包的权限 | 权限控制的粒度是 SQL 语句,用户需要具有访问 SQL 语句中每个数据对象的权限 |
如果 SQL 语句中的对象被修改,如 DDL 执行,整个包都需要重新绑定 | 当 SQL 语句中的对象被修改时,仅执行过的语句在下次运行时需要重新编译 |