养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

sql占位符怎么用

时间:2024-11-02 10:31:01

1.增加SQL代码可读性2.占位符可以预先编译,提高执行效率3.防止SQL注入4用占位符的目的是绑定变量,这样可以减少数据SQL的硬解析,所以执行效率会提高不少

方法/步骤

1、绑定变量是Oracle解决硬解析的首溴溢菏确要利器,能解决OLTP系统中librarycache的过度耗用以提高性能绑定变量是Oracle鞅瓞慈玢解决硬解析的首要利器,能解决OLTP系统中librarycache的过度耗用以提高性能。然刀子磨的太快,使起来锋利,却容易折断。凡事皆有利弊二性,因地制宜,因时制宜,全在如何权衡而已。本文讲述了绑定变量的使用方法,以及绑定变量的优缺点、使用场合。提到绑定变量,就不得不了解硬解析与软解析。硬解析简言之即一条SQL语句没有被运行过,处于首次运行,则需要对其进行语法分析,语义识别,跟据统计信息生成最佳的执行计划,然后对其执行。而软解析呢,则是由于在librarycache已经存在与该SQL语句一致的SQL语句文本、运行环境,即有相同的父游标与子游标,采用拿来主义,直接执行即可。软解析同样经历语法分析,语义识别,且生成hashvalue,接下来在librarycache搜索相同的hashvalue,如存在在实施软解析。有关更多的硬解析与软解析以及父游标,子游标绑定变量是为了减少解析的,比如你有个语句这样:selectaaa,bbbfromcccwhereddd=eee;如果经常通过改变eee这个谓词赋值来查询,像如下selectaaa,bbbfromcccwhereddd=fff;selectaaa,bbbfromcccwhereddd=ggg;selectaaa,bbbfromcccwhereddd=hhh;每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量:sql.executeQuery("UPDATEemployeesSETsalay=150.00WHEREid=1");sql.executeQuery("UPDATEemployeesSETsalay=150.00WHEREid=2");sql.executeQuery("UPDATEemployeesSETsalay=150.00WHEREid=3");sql.executeQuery("UPDATEemployeesSETsalay=150.00WHEREid=4");....sql.executeQuery("UPDATEemployeesSETsalay=150.00WHEREid=10000");使用绑定变量:UPDATEemployeesSETsalay=?WHEREid=?"二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。什么时候不应该/不必要使用绑定变量•a.如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。•b.变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划,从而使得非高效的执行计划被使用。大家都知道在HQL中可以使用?或者:***的方式在外部配置查询参数,如:Queryquery=session.createQuery("fromTestStuswheres.team=:teamands.age>:age");或者Queryquery=session.createQuery("fromTestStuswheres.team=?ands.age>?);这句话的意思是从一个持久的team对象中,取出其持有的TestStu集合,并筛选出age大于执行数据的记录我们可以这样设置参数query.setParameter("team",team,Hibernate.entity(TestTeam.class));//或者使用query.setEntity("team",team);query.setParameter("age",15);

© 一点知识