存储过程与SQL语句如何选择

58到家数据库30条军规,有一条是“禁止使用存储过程、视图、触发器、Event”,

高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,

并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。

数据库擅长存储与索引,在目前的互联网系统架构中,服务器的扩展要比存储的扩展更简单,

需要考虑系统可能的瓶颈在服务器还是数据存储,存储过程有它的优点,应该在开发中合理的选用。

应用存储过程的优点

存储过程是一组预先创建并用指定的名称存储在数据库服务器上的 SQL 语句,将使用比较频繁或者比较复杂的操作,预先用 SQL 语句写好并存储起来,以后当需要数据库提供相同的服务时,只需再次执行该存储过程。

1.具有更好的性能

存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以提高数据库执行速度。

2.功能实现更加灵活

存储过程中可以应用条件判断和游标等语句,有很强的灵活性,可以直接调用数据库的一些内置函数,完成复杂的判断和较复杂的运算。

3.减少网络传输

复杂的业务逻辑需要多条 SQL 语句,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会减少,降低了网络负载。

4.具有更好的安全性

(1)数据库管理人员可以更好的进行权限控制,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

(2)在通过网络调用过程时,只有对执行过程的调用是可见的。无法看到表和数据库对象名称,不能嵌入SQL 语句,有助于避免 SQL 注入攻击。

存储过程的弊端

1.架构不清晰,不够面向对象

存储过程不太适合面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,业务逻辑在存储层实现,增加了业务和存储的耦合,代码的可读性也会降低,

2.开发和维护要求比较高

存储过程的编写直接依赖于开发人员,如果业务逻辑改动较多,需要频繁直接操作数据库,大量业务降维到数据库,很多异常不能在代码中捕获,出现问题较难排查,需要数据库管理人员的帮助。

3.可移植性差

过多的使用存储过程会降低系统的移植性。在对存储进行相关扩展时,可能会增加一些额外的工作。

存储过程与SQL语句如何抉择

架构设计没有绝对,只有在当前的场景下最合适的。

普通的项目开发中,不建议大量使用存储过程,对比SQL语句,存储过程适用于业务逻辑复杂,比较耗时,同时请求量较少的操作,例如后台大批量查询、定期更新等。

(1)当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时可以考虑应用存储过程
(2)在一个事务的完成需要很复杂的商业逻辑时可以考虑应用存储过程
(3)比较复杂的统计和汇总可以考虑应用后台存储过程

时间: 2024-10-05 04:25:20

存储过程与SQL语句如何选择的相关文章

存储过程与SQL语句怎么选择

应用存储过程的优点:1.具有更好的性能存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以提高数据库执行速度.2.功能实现更加灵活存储过程中可以应用条件判断和游标等语句,有很强的灵活性,可以直接调用数据库的一些内置函数,完成复杂的判断和较复杂的运算.3.减少网络传输复杂的业务逻辑需要多条 SQL 语句,当客户机和服务器之间的操作很多时,将产生大量的网络传输.如果将这些操作放在一个存储过程中,那么客户机和服务器

为什么存储过程比sql语句效率高?

存储过程经过预编译处理 而SQL查询没有 SQL语句需要先被数据库引擎处理成低级的指令 然后才执行 ------------------------------------------------------- 如果是只执行一次的话,存储过程不一定比SQL语句效率高.因为存储过程有个预先编译的过程.就是.启动服务器后或者第一次执行后(可以设置).就可以把存储过程加载到高速缓存中,这样以后调用起来就不用再通过编译 执行效率当然就高喽..另外执行存储过程只需要传递几个参数..用语句的话可能需要一大串

存储过程和SQL语句比较

做为SQL存储过程和.NET的新手,下面的指导还是很有用的,自己这一段刚刚接触这些东西,搜集了一些相关的东西,能使新手较容易上手,当然啦,要精通和熟练应用,还是要看更多更深的资料的,高手请不要见笑.以下内容均来自网络,只供参考学习:--------存储过程与SQL语句的恩怨情仇 程序员说:存储过程还是SQL语句,这是一个问题.江 湖现在有三个流派,一个是SQL语句流的,崇尚使用SQL语句,一派是存储过程派的,崇尚用存储过程说话,还有一派是中庸派的,讲求和谐,所以也就前两派 吵得厉害,中庸派的看热

EF增删查改加执行存储过程和sql语句,多种方法汇总

1 ActionUrl c = new ActionUrl() { ActionName="test", RequestUrl="/123/123", SubTime=DateTime.Now }; 2 //增 3 using (EntityContext db = new EntityContext()) 4 { 5 6 /*方法1*/ 7 db.ActionUrls.Add(c); 8 db.SaveChanges(); 9 /*方法2*/ 10 db.Set&

sql存储过程比sql语句执行慢很多

参数嗅探的问题 原因:(1)可能是发生了参数嗅探,第一次赋给存储过程的输入参数,会为该存储过程生成一个基于输入参数的执行计划,因此如果第一次输入的参数不具有代表性(例如大部分查询输入的参数都是A值,但第一次执行存储过程时输入的是B值),就有可能比即席查询慢,尽管即席查询需要重新编译执行计划,但选择了更有效率的计划.尝试使用和即席查询一样的参数,来执行存储过程,然后对比一下两者的执行计划.(2)通常存储过程最上面有自带的set设置,如set ansi_nulls on,而即席查询通常没有包含,这些

存储过程和SQL语句的区别优缺点

答: 存储过程的优缺点: 优点: 1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProcedure为封装此代码提供了一个替换位置. 2.执行计划(存储过程在首次运行时将被编译,这将产生一个执行计划-- 实际上是 Microsoft SQL Server为在存储过程中获取由 T-SQL 指定的结果而必须采取的步骤的记录.)缓存改善性能. ……..但sql server新版本,执行计划已针对所有 T-SQL 批处理进行了缓存,而不管它们是否在存储过程中

基于ORACLE数据库的循环建表及循环创建存储过程的SQL语句实现

一.概述 在实际的软件开发项目中,我们经常会遇到需要创建多个相同类型的数据库表或存储过程的时候.例如,如果按照身份证号码的尾号来分表,那么就需要创建10个用户信息表,尾号相同的用户信息放在同一个表中. 对于类型相同的多个表,我们可以逐个建立,也可以采用循环的方法来建立.与之相对应的,可以用一个存储过程实现对所有表的操作,也可以循环建立存储过程,每个存储过程实现对某个特定表的操作. 本文中,我们建立10个员工信息表,每个表中包含员工工号(8位)和年龄字段,以工号的最后一位来分表.同时,我们建立存储

sql server、db2、oracle 存储过程动态sql语句示例

Oracle CREATE OR REPLACE PROCEDURE a_test AS t_sql VARCHAR2(2000); t_a VARCHAR2(20); t_b VARCHAR2(20); t_c VARCHAR2(20); t_d VARCHAR2(20); BEGIN t_c := 'f'; t_d := 'g'; --这里可为insert 等任何sql语句. t_sql := 'SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC O

oracle存储过程,sql语句执行时间

create or replace procedure sum_info is i integer; temp1 varchar2(50); temp2 varchar2(50); t1 date; t2 date; v_sql varchar2(100); v_sqm varchar2(100); u_name t_temp.u_name%TYPE; t_name t_temp.t_name%TYPE; c_name t_temp.c_name%TYPE; cursor tb_list is