参数化查询

   众所周知,参数化查询有许多好处,例如可以防止SQL注入,提高查询效率等,那么参数化查询为什么就可以解决这些问题呢?


1,参数化查询防止SQL注入
参数化查询顾名思义就是我们写好需要的参数,然后直接给参数赋值,这就好比是一个sql的框架。sql查询的时候会进行参数分析,如果分析的结果是我们曾使用过这样的框架,那么sql会重用查询计划,否则会重新生成一个查询计划,当然此时的sql的语义肯定是发生了变化,这时我们就可以很好的防止注入的发生。
例如

         

如上的代码就是使用参数化的查询语句,尝试输入注入字符,结果当然是什么都查不到!


2,参数化查询提高查询效率

为了提高sql执行速度,请为SqlParameter参数加上SqlDbType和size属性,在参数化查询代码编写过程中很多开发者忽略了指定查询参数的类型,这将导致托管代码在执行过程中不能自动识别参数类型,进而对该字段内容进行全表扫描以确定参数类型并进行转换,消耗了不必要的查询性能所致。


例如:

传递过来的值是"username",则size值为8,"username1",则size值为9。那么,不同的size值会引发什么样的结果呢?且经测试发现,size的值不同时,会导致数据库的执行计划不会重用,这样就会每次执行sql的时候重新生成新的执行计划,而浪费数据库执行时间。


      

即,如果参数的size值不同则会重新创建一个查询计划,但是如果我们设定了他们的size值都为50,那么每次执行sql的时候就会重用查询计划,提高效率。


    以上两点的实现都提到了重用查询计划,那么什么是查询计划呢?什么时候才会重用查询计划?

    Sql Server在执行一条查询语句之前都对对它进行“编译”并生成“查询计划”,查询计划告诉Sql Server的查询引擎应该用什么方式进行工作。Sql Server会根据当前它可以收集到的各种信息(例如内存大小,索引的统计等等)把一条查询语句编译成它认为“最优”的查询计划。很显然,得到这样一个查询计划需要消耗CPU资源,而大部分的查询语句每次经过编译所得到的查询计划往往是相同的,因此除非指定了RECOMPILE选项,Sql Server在执行查询语句时,会对查询计划进行缓存——也就是说,如果是相同的查询语句,Sql Server只会对它进行一次编译操作,然后在每次执行时对查询计划进行复用。



 

posted @ 2013-03-27 22:38  javawebsoa  Views(1067)  Comments(0Edit  收藏  举报