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

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

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

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

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

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

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

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

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

>由于每个非参数化查询都是对SQL Server的新的不同查询,因此必须针对每个查询执行确定执行计划的所有步骤(从而浪费时间 – 并且还浪费计划缓存空间,因为存储执行计划到计划缓存最终并没有真​​正帮助,因为该特定查询可能不会再次执行)>非参数化查询存在SQL注入攻击的风险,应该不惜一切代价避免

相关文章
相关标签/搜索