繁体   English   中英

存储过程与数据库查询中的代码

[英]Stored Procedures vs Code in Database Query

访问数据库以使用 ASP.NET 代码进行查询与使用 SQL 存储过程之间的性能差异是什么?

为了便于使用,对查询进行编码更容易,尤其是在进行维护和更改时。

但是,存储过程是在数据库中编译并由数据库运行的。

哪个更有效,更好用?

SQL Server 缓存任何查询的执行计划,无论是否为 SPROC。 这里几乎没有区别。 基本上,您可以在使用 sproc 时通过网络发送查询文本,仅此而已。 来源: http : //msdn.microsoft.com/en-us/library/ms181055.aspx

在没有特殊原因的情况下,做对你来说更方便的事情。

其他表明 sproc 性能通常更好的答案是不正确的。

只要它是以数据库为中心的查询,那么存储过程在大多数情况下将是更快的选择(性能)。

但它更难维护,因为它不在您的常规源包中。

“更好用”取决于要求。 如果查询速度稍慢(例如 1 ms VS 3 ms)还可以,那么将您的代码放在一起并将其放在 ASP 中。 如果性能是您想要的东西,请将其放入数据库中。

我将大部分查询放在代码中,并且只将那些需要数据库中的性能。

当然,这也取决于所使用的数据库系统。

关于您实际比较的内容,您的问题非常不完整。

SQL 代码是在存储过程中还是在客户端提交的完整的内联 SQL 语句中,通常对性能几乎没有影响(假设参数化正确且 SQL 是非病态的)。 它可以在安全体系结构和访问基表或视图而不是过程的执行权限方面产生很大的不同。 存储过程鼓励将参数化作为一项要求,但使用内联 SQL 也可以进行参数化。

如果您正在谈论对从数据库返回的集合执行逻辑而不是在数据库中执行工作,这可以是双向的 - 这取决于操作类型、索引类型、客户端和数据库之间的带宽以及请求数量需要维修。

通常,我会首先在数据库中执行此操作,以保持从客户端抽象出来的连接/循环逻辑并减少线路上的数据(列和行)并向客户端提供一个简单的数据集 API,但它取决于.

这是一个“视情况而定”的问题。
假设这是 SQL Server 2008R2 或更高的标准版或企业版,存储过程的缓存将与 TSQL 语句不同。 由于参数化、代码编译、参数嗅探和各种其他优化等多种因素,复杂的 T-SQL 语句的性能几乎总是比存储过程差。 一般来说,我更喜欢存储过程,因为它们更容易优化。 此外,您无需重新编译和重新部署任何代码即可更改存储的程序。 并且优化(例如“优化未知”或“重新编译”可以应用于参数值剧烈变化时的存储过程)可以应用于存储过程并在最终用户甚至没有注意到的情况下取消(好吧,除了性能变化)。

一次运行后,存储过程将始终在计划缓存中结束,并且永远不会被视为即席查询。 临时查询,取决于 SQL 设置,可能会或可能不会存储在计划缓存中。 加上添加或删除字符(假设它没有参数化)将导致 SQL Server 构建新计划,而构建新计划是一个缓慢的操作。

TL;DR - 使用 SQL Server 2008R2 或更高标准/企业版; 对于简单的查询,您会发现没有区别。 对于复杂的查询,存储过程(如果编写得当)几乎总是会执行 T-SQL。 存储过程也更容易在以后优化。

编辑 - 在 SQL 版本中添加。 我不确定旧的 SQL 版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM