为什么使用参数化查询将数据插入表中比将值附加到查询字符串更快?

时间:2009-12-05 10:36:55

标签: sql database sql-parametrized-query

为什么使用参数化查询将数据插入表中:

string queryString = "insert into product(id, name) values (@id, @name)";

比将值附加到查询字符串更快:

string queryString = "insert into product(id, name) values (" + _id + ", " + _name + ")";

当我在循环中使用该命令插入10K行时,参数化查询比另一行快一个数量级。

我知道参数化查询具有安全性和可维护性优势,并且它是推荐的使用方式,但现在我对解释为什么它的速度要快得多感兴趣?

5 个答案:

答案 0 :(得分:8)

通常,执行SQL查询最昂贵的部分是构建执行计划 - 确定将需要哪些表,确定要使用的最佳索引(如果有)等。您可以将其视为“如果你愿意,可以编译“查询。”

使用参数化查询时,可以准备一次,然后插入不同的目标值。由于它与不同数据的操作相同,因此无需每次都重建执行计划。要扩展“编译”比喻,这就像使用不同的配置文件重新运行相同的程序一样。

但是,当您附加值时,您会将它们硬编码到查询中,因此每次都必须重新准备它,并且每次迭代都需要为每个迭代构建新的执行计划。再次使用“编译”比喻,这就像一个C程序,其所有配置都是硬编码的 - 改变一个设置,你必须重新编译整个事物。

(进行批量插入时可能遇到的另一个主要成本是更新索引。如果您的表已编入索引,您可能希望尝试关闭它们,执行插入操作并重新打开它们以便它只需要重新编制索引一次,而不是在添加每一行之后。)

答案 1 :(得分:5)

简单。在查询执行开始之前,解析和准备查询的执行计划会花费很多时间。

当您将参数作为文本附加到查询时,每个查询都是不同的,因此DB需要解析它并准备执行计划。

当您使用参数时,您将多次发送相同的查询(使用不同的数据),并且DB可以简单地重用早期调用中的执行计划。

在大多数情况下,这只是查询之间的文本比较。 例如,在MS SQL Server中,它足以更改字母大小写或在查询结尾添加空格以强制DB重新创建执行计划。

答案 2 :(得分:4)

根据您使用的数据库,通常的原因是因为参数化查询只需编译一次,每次使用时都会重新编译动态查询版本。

答案 3 :(得分:3)

这是由于数据库缓存了查询计划,这使得它更快。

对于Sql server,请参阅此解释

Execution Plan Caching and Reuse

答案 4 :(得分:0)

我敢打赌,如果你使用多个值,它会不会更快 你最多可以做1000次

string queryString = "insert into product(id, name) values " + 
"   (" + _id  + ", " + _name  + ")" + 
" , (" + _id1 + ", " + _name1 + ")" + 
" , (" + _id2 + ", " + _name2 + ")";