6

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

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

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

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

?

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

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

4

5 回答 5

8

一般来说,执行 SQL 查询最昂贵的部分是构建执行计划 - 确定需要哪些表,确定要使用的最佳索引(如果有的话)等。您可以将其视为“编译”喜欢就查询。

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

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

(进行批量插入时您可能遇到的另一个主要成本是更新索引。如果您的表被索引,您可能想尝试关闭它们,执行插入,然后重新打开它们,因此只需重新索引一次而不是在添加每一行之后。)

于 2009-12-05T10:55:38.563 回答
5

简单的。即使在查询执行开始之前,解析和准备查询的执行计划也需要大量时间。

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

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

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

于 2009-12-05T10:44:33.243 回答
4

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

于 2009-12-05T10:41:03.340 回答
3

这是由于数据库缓存了查询计划,这使其速度更快。

对于 Sql server 看这个解释

执行计划缓存和重用

于 2009-12-05T10:39:36.327 回答
0

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

string queryString = "insert into product(id, name) values " + 
"   (" + _id  + ", " + _name  + ")" + 
" , (" + _id1 + ", " + _name1 + ")" + 
" , (" + _id2 + ", " + _name2 + ")"; 
于 2016-09-28T14:57:17.007 回答