数据库中Sql语句,存储过程,触发器对性能影响的理解

相比inline sql,很多人更喜欢使用存储过程,为何?很多人会说:“因为存储过程是预编译并且缓存了的,因此比原生sql会更快”

这句话某个时候是正确的,先解释一下依据:sql第一次执行的时候,发生了三件事情

1.  Sql 语法错误检查

2.  最好的执行计划来执行Sql(例如选择使用聚簇索引,或者非聚簇索引等)

3.  执行Sql

       上述流程也适合存储过程第一次执行,只不过存储过程的执行计划会被缓存到内存中,所以,当存储过程下次再被执行的时候,就会从缓存中直接取出缓存的计划执行,而不再执行上述1 、2 两步,因此性能得以提高;而原生内嵌sql(不知道咋翻译,反正就是你在app中定义的sql,new sqlcommand("select * from user" +......))则必须重复上述三个动作。

     但是,上述情况的适用范围随着sqlserver的发展而有所变化,上述情况只发生在老版本的Sqlserver上,从sqlserver2005之后,系统一视同仁,存储这个优势没了,都会被预编译和缓存。


Sql语句:

新版本Sqlserver中,在Sql查询参数不变的情况下,会使用原来的缓存,若查询参数发生改变,则会重新执行12步操作,创建新的缓存(例如:select * from table where id=1;select * from table where id=2;);

存储过程:

我们知道,存储过程会进行预编译并使用原来的缓存,但是在新版本Sqlserver中,使用参数化的内嵌Sql也能达到预编译都会被预编译和缓存。

但是,使用存储过程有几点好处:

	1.抽象分离
		代码不用再考虑诸如字段名、表名的东西了,将减少改数据库时对代码影响
	2.安全
		这或许是最好的理由了,你可以为存储过程分配可执行权限
	3.维护方便
		出了问题,直接在存储过程中解决,不必重新发布编译exe/dll了
	4.集中调整
		若有sql性能问题,可以由DBA单独隔离搞定
	5.游标,临时表
		如有复杂的诸如if else ,cursor等东西,还是存储过程用起来顺手方便
 
	触发器:
	在大量并发的情况下,使用触发器是很危险的事。在并发量大的系统中触发器很影响性能的. 如果非用不可,一定要注意SQL的质量. 对性能的影响大小跟SQL的质量关系很大.不能一概而论.触发器多不是好事:      
	第一:一定会影响性能,若是数据量大时,每次都要触发上百上千触发器可想而知      
	第二:基于维护方面,不谈有多少触发器,当每修改一次触发表相应触发器就失效,符出代价可想而知.           
	不建议多用触发器,用函数与过程代替之.
参考文档:http://blog.csdn.net/kufeiyun/article/details/8654336

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值