即席查询与存储过程对比动态SQL

Kri*_*aps 17 sql stored-procedures adhoc-queries dynamic-sql

即席查询与存储过程对比动态SQL.任何人都可以说利弊吗?

Bil*_*zke 30

存储过程

  • Pro:适用于简短的简单查询(也称为OLTP - 即添加,更新,删除,查看记录)
  • Pro:将数据库逻辑与业务逻辑分开
  • 专业:易于排除故障
  • 亲:易于维护
  • Pro:通过网络传输的位数较少(即只有proc名称和参数)
  • 亲:在数据库中编译
  • Pro:更好的安全性(用户不需要直接访问表)
  • Pro:优秀的查询计划缓存(适用于OLTP查询 - 从计划重用中获益)
  • Con:优秀的查询计划缓存(对OLAP查询不利 - 从独特计划中获益)
  • Con:使您与该SQL供应商联系在一起

动态SQL (即在存储过程中使用exec命令)

  • Pro:适用于简短的简单查询(也称为OLTP)
  • Pro:将数据库逻辑与业务逻辑分开
  • Pro:通过网络传输的位数较少(即只有proc名称和参数)
  • Pro:允许引用任何表,数据库或列
  • Pro:允许根据参数添加/删除谓词(在WHERE子句中)
  • Pro:良好的查询计划缓存(OLTP和OLAP查询的中等到良好)
  • Con:只能编译proc的静态元素
  • Con:使您与该SQL供应商联系在一起
  • 骗局:更难以排除故障
  • Con:更容易受到SQL注入攻击

Ad Hoc SQL(即在您的业务代码中创建)

  • Pro:适合长期,复杂的quieres(又名OLAP - 即报告或分析)
  • Pro:灵活的数据访问
  • Pro:可以使用ORM; 可以在代码中编译/测试(即Linq-to-Sql或SqlAlchemy)
  • Pro:查询计划缓存不佳(适用于OLAP查询 - 从独特计划中获益)
  • Con:查询计划缓存不佳(对OLTP查询不利 - 从计划重用中获益)
  • Con:通过网络传输更多比特(即整个查询和参数)
  • Con:如果您不使用ORM,则更难以维护
  • Con:如果不使用ORM,则更难以排除故障
  • Con:更容易受到SQL注入攻击

注意:始终参数化您的临时SQL.

对于OLAP ad hoc SQL:仅参数化字符串数据.这满足两个条件.它可以防止SQL注入攻击.它使查询看起来更加独特.是的,您将获得较差的查询计划缓存命中率.但这对于OLAP查询来说是理想的.他们受益于独特的计划生成,因为他们的数据集和最有效的计划在给定参数之间差异很大.

  • 还有另一个**大**加上存储过程:您的用户不需要直接表访问!安全性(和安全性)方面的巨大优势 (2认同)