luv*_*ere 6 sql database sql-parametrized-query
为什么使用参数化查询将数据插入表中:
string queryString = "insert into product(id, name) values (@id, @name)";
Run Code Online (Sandbox Code Playgroud)
比将值附加到查询字符串更快:
string queryString = "insert into product(id, name) values (" + _id + ", " + _name + ")";
Run Code Online (Sandbox Code Playgroud)
?
当我在循环中使用该命令插入10K行时,参数化查询比另一个快一个数量级.
我知道参数化查询具有安全性和可维护性的好处,并且它是推荐的使用方式,但现在我对解释为什么它更快更快感兴趣?
通常,执行SQL查询最昂贵的部分是构建执行计划 - 确定将需要哪些表,确定要使用的最佳索引(如果有)等.您可以将此视为"编译"查询,如果你喜欢.
使用参数化查询时,可以准备一次,然后插入不同的目标值.由于它与不同数据的操作相同,因此无需每次都重建执行计划.要扩展"编译"比喻,这就像使用不同的配置文件重新运行相同的程序一样.
但是,当您附加值时,您将它们硬编码到查询中,因此每次都必须重新准备它,并且您需要为每次迭代构建新的执行计划.再次使用"编译"比喻,这就像一个C程序,其所有配置都是硬编码的 - 更改一个设置,您必须重新编译整个事物.
(进行批量插入时可能遇到的另一个主要成本是更新索引.如果您的表已编入索引,您可能希望尝试关闭它们,执行插入操作并重新打开它们以便只需重新编制索引一次而不是在每行添加之后.)
简单.即使在查询执行开始之前,解析和准备查询的执行计划也需要很长时间.
当您将参数作为文本附加到查询时,每个查询都是不同的,因此DB需要解析它并准备执行计划.
当您使用参数时,您将多次发送相同的查询(使用不同的数据),并且DB可以简单地重用早期调用的执行计划.
在大多数情况下,这只是查询之间的文本比较.例如,在MS SQL Server中,它足以更改字母大小写或在查询结尾添加空格以强制DB重新创建执行计划.
| 归档时间: |
|
| 查看次数: |
3622 次 |
| 最近记录: |