为什么使用参数化查询将数据插入表中:
string queryString = "insert into product(id, name) values (@id, @name)";
比将值附加到查询字符串更快:
string queryString = "insert into product(id, name) values (" + _id + ", " + _name + ")";
当我在循环中使用该命令插入10K行时,参数化查询比另一行快一个数量级。
我知道参数化查询具有安全性和可维护性优势,并且它是推荐的使用方式,但现在我对解释为什么它的速度要快得多感兴趣?
答案 0 :(得分:8)
通常,执行SQL查询最昂贵的部分是构建执行计划 - 确定将需要哪些表,确定要使用的最佳索引(如果有)等。您可以将其视为“如果你愿意,可以编译“查询。”
使用参数化查询时,可以准备一次,然后插入不同的目标值。由于它与不同数据的操作相同,因此无需每次都重建执行计划。要扩展“编译”比喻,这就像使用不同的配置文件重新运行相同的程序一样。
但是,当您附加值时,您会将它们硬编码到查询中,因此每次都必须重新准备它,并且每次迭代都需要为每个迭代构建新的执行计划。再次使用“编译”比喻,这就像一个C程序,其所有配置都是硬编码的 - 改变一个设置,你必须重新编译整个事物。
(进行批量插入时可能遇到的另一个主要成本是更新索引。如果您的表已编入索引,您可能希望尝试关闭它们,执行插入操作并重新打开它们以便它只需要重新编制索引一次,而不是在添加每一行之后。)
答案 1 :(得分:5)
简单。在查询执行开始之前,解析和准备查询的执行计划会花费很多时间。
当您将参数作为文本附加到查询时,每个查询都是不同的,因此DB需要解析它并准备执行计划。
当您使用参数时,您将多次发送相同的查询(使用不同的数据),并且DB可以简单地重用早期调用中的执行计划。
在大多数情况下,这只是查询之间的文本比较。 例如,在MS SQL Server中,它足以更改字母大小写或在查询结尾添加空格以强制DB重新创建执行计划。
答案 2 :(得分:4)
根据您使用的数据库,通常的原因是因为参数化查询只需编译一次,每次使用时都会重新编译动态查询版本。
答案 3 :(得分:3)
答案 4 :(得分:0)
我敢打赌,如果你使用多个值,它会不会更快 你最多可以做1000次
string queryString = "insert into product(id, name) values " +
" (" + _id + ", " + _name + ")" +
" , (" + _id1 + ", " + _name1 + ")" +
" , (" + _id2 + ", " + _name2 + ")";