说动态SQL之前先来说下静态SQL
静态SQL语句
语句中主变量的个数与数据类型在预编译时都是确定的,我们称这类嵌入式SQL语句为静态SQL语句。
与之相对应的就是动态SQL
动态SQL方法允许在程序运行过程中临时“组装”SQL语句。
那么他们之间的区别是什么呢?
静态sql的执行计划(DB2称存取路径)是在运行前就确定好的
动态sql的执行计划(DB2称存取路径)是在运行时动态生成的。由于是在运行时动态生成执行计划,因此生成的执行计划(DB2称存取路径)相对更优,但考虑到生成执行计划(DB2称存取路径)的开销,有可能应用程序的运行时间相对会比静态sql长些 。
绑定变量
在
SQL
语句中,绑定变量是一个占位符。例如,为了查询员工号为
123
的员工的信息,可以查询:
1
)
select * from emp where empno=123;
另外,也可以查询:
2
)
select * from emp where empno=:empno
。
那么每次查询都是一个新查询,即在数据库共享池中以前没有过的查询。每次查询必须经过分析、限定(名称解析)、安全检查、优化等等,简单地说,执行的每条语句在每次执行时都将必须经过编译。
在第二个查询
2
)中使用了绑定变量
:empno
,它的值在查询执行时提供。查询经过一次编译后,查询方案将存储在共享池中,可以用来检索和重用。在性能和可伸缩性方面,这两者的差异是巨大的,甚至是惊人的
从上所述,很明显看出,分析一个带有硬编码量的语句将比重用一条已分析过的查询方案花费更长的时间和消耗更多的资源,不明显的是前者将减少系统所能支持的用户数量。很明显,部分原因是由于增加资源消耗量,但更主要的因素是在解析
sql
语句的过程中对共享池中锁存器(
latch
)的争
通过使用绑定变量,应用程序提交的相似的
sql
语句只需要解析一次,就可以重复使用,这非常有效,这也是
Oracle
数据库要求使用的工作方式。不仅使用较少的资源,而且可以减少锁存(
latch
)时间,降低锁存(
latch
)次数,这将提高应用系统性能,并且大大提高可伸缩性。
在IBATS中,采用的是动态SQL加绑定变量的方式。
IBATS中是根据传递过来的变量是否空来拼接SQL的,这就是动态SQL。
而传递来的参数是根据绑定变量来执行的。
比如下面的例子,我要查询用户信息。
在前台页面输入用户名,zhangsan
传到IBATS后,执行SQL,在数据库查看刚刚执行的SQL
查看方法如下:
-
select
sql_text
from
v$sql
where
sql_text
like
'select t.username ,t.password, t.sex ,t.mobile from users t%'
注意:在ORACLE中,要查看v$sql 这个视图,得较高的权限,我是用DBA权限进去查看的。
看到这样的语句:
-
select
t.username ,t.
password
, t.sex ,t.mobile
from
users t
where
t.username = :1
如果再查lisi的用户信息,在数据库看执行的SQL。发现还是上面那条SQL。
所以,绑定变量的好处就是每次都执行的同一条SQL,只是输入的变量值不同。
下面直接在数据量中执行下面的两个SQL:
-
select
t.username ,t.
password
, t.sex ,t.mobile
from
users t
where
t.username =
'zhangsan'
;
-
select
t.username ,t.
password
, t.sex ,t.mobile
from
users t
where
t.username =
'lisi'
;
再看数据库中执行的SQL,发现是下面的结果:
可以看到,不使用绑定变量时,是执行的不同的SQL。
总结:ibats采用的是动态SQL+绑定变量的方式。 动态SQL在运行时编译,所以执行计划更优,但相对于静态编译的静态SQL或者存储过程更耗性能。
绑定变量可以重复利用相似的SQL,使效率更高。
分享到:
相关推荐
动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. 什么是动态SQL 动态SQL指的是在运行时动态生成并执行的SQL语句。与静态SQL(在...
标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...
它提供了一种安全的方式来自定义和执行动态SQL,同时还可以绑定参数,避免了SQL注入的问题。 #### `sp_executesql`的基本语法 `sp_executesql`的基本语法如下: ```sql sp_executesql @stmt = N'<your SQL ...
注意如何查询sql自动绑定变量,执行以上sql分析执行情况
绑定变量是 Oracle 数据库的一种特性,它旨在提高数据库系统的性能和可扩展性。在本文中,我们将详细地探讨绑定变量的目的、命名方法、使用限制条件和应用实例。 为什么使用绑定变量? 绑定变量是解决 Oracle 应用...
查找未使用绑定变量sql.sql
- **动态SQL**:在编程语言如Java、Python等与Oracle数据库交互时,经常使用预编译的PreparedStatement,其中就包含了绑定变量的概念。 - **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量...
绑定变量是一种在执行SQL语句时动态填充参数值的技术,它可以显著减少硬解析(Hard Parse)的次数,从而降低SQL语句执行时对CPU资源的消耗以及减少latch等待等问题。 ### 绑定变量的意义 #### 1. 减少Hard Parse ...
绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法带来了显著的优势,尤其是在处理大量相似但不完全相同的查询时。 1. 为什么使用绑定变量? - **提高性能**...
为了克服这个问题,并充分利用绑定变量带来的性能优势,我们可以设计一个通用模块`SQLWhere_ClauseByBind_VariableGeneraterUtils`来帮助动态构建带有绑定变量的SQL语句及其对应的值设置。该模块的核心逻辑如下: `...
为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...
绑定变量是PLSQL中的一种强大工具,能够提高数据库的性能和可扩展性。在Oracle中,对于一个提交的SQL语句,存在两种可选的解析过程,一种叫做硬解析,一种叫做软解析。硬解析需要经解析、制定执行路径、优化访问计划...
sql学习 体会绑定变量的trace试验.sql
sql学习 体会绑定变量的AWR试验.sql
sql学习 思考绑定变量带来性能飞跃.sql
通过对使用绑定变量和未使用绑定变量的SQL查询进行比较,可以直观地看到使用绑定变量能够显著减少解析时间,并且能够有效避免SQL注入等问题。 ##### 案例2:绑定变量应用于数据倾斜的列 当绑定变量用于数据倾斜的列...
sql学习 纠结,绑定变量也有冬天.sql
sql学习 awr体验(绑定变量).sql
然而,在 DSS 应用和数据仓库应用中,因为并发性较低,CPU 上的争用不那么严重,可以选择不使用绑定变量,而是使用索引扫描来提高性能。 绑定变量窥视功能的优点是可以提高数据库性能,减少 CPU 的使用率,提高 SQL...
Oracle的共享池设计的初衷是为了高效地存储和重用SQL语句,而绑定变量正是实现这一目标的关键。 在Java中,我们可以通过使用PreparedStatement对象来实现Oracle的绑定变量。例如: ```java String v_id = 'xxxxx'; ...