- 0
- 0
- 约3.82千字
- 约 3页
- 2020-02-26 发布于陕西
- 举报
CHISC.NET - 全国医疗信息化联盟 ,为全国医疗信息化人士提供最强大的资源共享平台
Oracle绑定变量在C#.NET中的应用及意义
什么是绑定变量
绑定变量(bind variable) :
select * from emp where empno=:empno;
是用户放入查询中的占位符,它会告诉Oracle“我会随后为这个变量提供一个值,现在需要生成一个方案,但我实际执行语句的时候,会提供应该使用的实际值”。
实质就是用于替代sql语句中常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。
为什么使用绑定变量
使用绑定变量可以减少硬语法分析,优化共享池的使用。在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析。 当一个sql语句提交后,oracle会首先检查一下共享缓冲池里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。
一个硬解析需要经分析、解析、安全检查 、制定执行路径、优化访问计划等等许多的步骤。需消耗大量的cpu及资源。
举个例子,要查询编号为001的儿童,下面两种写法都可以实现:
select * from t_child where childid=’001’
select * from t_child where childid =: childid;//使用绑定变量
但是实际应用中经常是查询编号为001的儿童一次以后,有可能再也不用;接着你有可能查询儿童’002’,然后查询’003’
而第二个查询语句提供了绑定变量: childid,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;
若不使用绑定变量,每个查询的条件不同导致共享池中SQL语句数量太多,重用性极低,加速了SQL语句的老化,导致共享池碎片过多。?共享池中不同的SQL语句数量巨大,根据LRU原则,一些语句逐渐老化,最终被清理出共享池;这样就导致shared_pool_size 里面命中率下降,共享池碎片增多,可用内存空间不足。而为了维护共享池内部结构,需要使用latch,一种内部生命周期很短的lock,这将使用大量的cpu 资源,使得性能急剧下降。
?不使用绑定变量违背了oracle 的shared pool 的设计的原则,违背了这个设计用来共享的思想。
如何使用绑定变量
public DataSet GetDataTable(T_child entity)
{
ArrayList parmlist = new ArrayList();
ArrayList valuelist = new ArrayList();
String sql=select * from t_child where childid =: childid;
parmlist.Add(childid);
valuelist.Add(entity.Childid);
DataSet ds = SqlHelper(sql,dbName,valuelist,parmlist,ref errorMsg);
return ds;
}
调用以下方法:
public static DataSet SqlHelper(string query, string dataBaseName, ArrayList bllist, ArrayList pamlist, ref string returnMessage)
{
AdoHelper adoHelper = null;
try{
adoHelper = DatabaseConnectEntity.CreateHelper(dataBaseName);
IDataParameter[] parameters = new IDataParameter[bllist.Count];
if (adoHelper._dbFactory.DatabaseType == DatabaseType.DB_Oracle)
{
ArrayList paramlist = new ArrayList();
for (int i = 0; i bllist.Count; i++)
{
OracleParameter parm;
原创力文档

文档评论(0)