为什么执行存储过程比脚本中的SQL查询更快?

mar*_*zzz 21 sql sql-server stored-procedures

事实上,如果我从我的应用程序调用存储过程,我需要连接到我的数据库.

那么,为什么调用"存储过程"应该比"传递SQL查询"字符串更快?

mar*_*c_s 57

SQL Server基本上通过这些步骤来执行任何查询(存储过程调用或ad-hoc SQL语句):

1)语法检查查询
2)是否可以 - 它检查计划缓存以查看它是否已经有该查询的执行计划
3)是否有执行计划 - 该计划被(重新)使用并且执行查询
4)如果还没有计划,则确定执行计划
5)将计划存储到计划缓存中以供以后重用
6)执行查询

关键是:ad-hoc SQL和存储过程没有区别.

如果ad-hoc SQL查询正确使用参数 - 无论如何应该防止SQL注入攻击 - 它的性能特征没有什么不同,并且绝对不会比执行存储过程更糟糕.

存储过程具有其他好处(例如,无需授予用户直接表访问权限),但就性能而言,使用正确参数化的即席SQL查询与使用存储过程一样高效.

更新:使用存储过程比非参数化查询更好,主要有两个原因:

  • 由于每个非参数化查询都是对SQL Server的一个新的不同查询,因此必须对每个查询执行确定执行计划的所有步骤(从而浪费时间 - 并且还浪费计划缓存空间,因为存储执行计划进入计划缓存最终并没有真​​正帮助,因为那个特定的查询可能不会再次执行)

  • 非参数化查询存在SQL注入攻击的风险,应该不惜一切代价避免


Pur*_*ish 7

因为每次将查询字符串传递给SQL Server时,代码都必须编译等,存储过程已经编译好并准备在服务器上运行.

此外,您通过网络发送的数据较少,尽管这通常影响很小.

编辑:作为附注,存储过程有其他好处.

1)安全性 - 由于实际查询存储在服务器上,因此您不通过网络传输此信息,这意味着任何拦截您的网络流量的人都无法深入了解您的表结构.此外,精心设计的SP可以防止注射攻击.

2)代码分离,您将数据库代码保存在数据库中,将应用程序代码保存在应用程序中,几乎没有交叉,我发现这使得bug修复得更好.

3)可维护性和代码重用,您可以多次重复使用过程而无需复制粘贴查询,如果您希望更新查询,则只需在一个位置更新它.

4)减少网络流量.如上所述,对于大多数人来说这可能不是问题,但是对于大型应用程序,您可以通过切换到使用存储过程来显着减少通过网络传输的数据量.

  • 在缓存之前,必须首先分析任何存储过程,确定执行计划等.任何参数化查询都经历相同的过程,因此实际上具有与存储过程相同的性能优势 (4认同)
  • 但是,执行计划不是为存储过程无限期地存储并每次生成临时查询吗?事情可能已经改变了,但我相信过去就是这样。这可能意味着使用存储过程可以获得巨大的性能提升。虽然如果我没记错的话,这取决于您在存储过程中所做的事情,如果它很复杂,执行计划可能仍然会在每次调用时重新生成。任何意见? (2认同)