存储过程的性能会比批处理的T-SQL语句差吗?
最近我们项目用上了存储过程,下班时和两个同事交谈这个话题,发现他们都一致认为“
存储过程的执行效率很差”!其中一位同事还以他过去从事数据仓库的工作经验告诉我,性能瓶颈往往“
在于存储过程中使用了游标,而循环地fetch游标来按行处理记录将会导致性能的下降”,所以他们很多时候更宁愿“
在一个文件中预先写好需要的T-SQL语句序列,然后批处理它们”。
这我就糊涂了,因为我以前看过很多资料都说存储过程是有助于性能提高的(能预编译、减少网络通信量),怎么到了这些前辈的口中就变得完全相反呢。
请各位技术大虾指点指点。
------解决方案--------------------游标性能确实很差,但是和存储过程效率没有丁点关系,而且游标基本上都使用其他语句代替,不可免必须使用游标的地方很少。
学好SQL就要学会批处理,这个批处理的概念和其他的编程语言的概念不太一样,需要融会贯通。
预先写好的T-SQL语句序列也可以存为存储过程,安全性和性能,以及对于后期维护都方便很多。
你这些前辈肯定也是C,C++出生的程序员,对于数据库编程了解不多吧。
------解决方案--------------------拿游标来说存储过程是扯淡的事情,即席查询需要编译,存储过程大部分情况下只需要编译一次,在网络传输中,T-SQL可能会明文,最起码会把t-sql代码传来传去,存储过程只需要传输一个名称加参数,返回结果,这一部分又减少了网络带宽。根据日常工作经验,存储过程加前端程序更好调试。
谁TM叫他们用游标处理数据仓库的,用刀片砍树,用斧头切纸,然后说:刀片真烂,斧头也烂。你懂得这个道理不?
------解决方案--------------------性能瓶颈往往“在于存储过程中使用了游标,而循环地fetch游标来按行处理记录将会导致性能的下降”
呵呵,他们的这句话,只是说对了一半,其实任何代码,不管是批处理,还是函数,还是存储过程,甚至触发器,凡是用到了游标的地方,性能都不会好,而不是说存储过程用了游标,就是存储过程不好,而应该是游标不好。
------解决方案--------------------使用存储过程和使用T-SQL语句最大的区别就是存储过程在创建的时候就进行了编译以后调用时不再需要编译了速度快。而T-SQL语句每次执行都会进行编译一次速度慢。
存储过程的优点:1、预编译当一个sql语句包含在存储过程中时服务器不必每次执行它时都要分析和编译它避免了sql语句在网络中传输然后再解释的低效率问题;2、修改方便直接修改存储过程方便代码的管理;3、安全不会有sql语句注入问题;4、可以建立复杂的查询以非常复杂的方式更新数据库;5、可以使用、传送和返回参数。
缺点:1、增加复杂性业务逻辑比较复杂时不建议使用存储过程这样会增加复杂性;、2可移植性低在不同的数据库平台上很难移植。