为什么使用参数化查询将数据插入表中:
string queryString = "insert into product(id,name) values (@id,@name)";
比将值附加到查询字符串更快:
string queryString = "insert into product(id,name) values (" + _id + "," + _name + ")";
?
当我在循环中使用该命令插入10K行时,参数化查询比另一个快一个数量级.
我知道参数化查询具有安全性和可维护性的好处,并且它是推荐的使用方式,但现在我对解释为什么它更快更快感兴趣?
解决方法
通常,执行SQL查询最昂贵的部分是构建执行计划 – 确定将需要哪些表,确定要使用的最佳索引(如果有)等.您可以将此视为“编译”查询,如果你喜欢.
使用参数化查询时,可以准备一次,然后插入不同的目标值.由于它与不同数据的操作相同,因此无需每次都重建执行计划.要扩展“编译”比喻,这就像使用不同的配置文件重新运行相同的程序一样.
但是,当您附加值时,您将它们硬编码到查询中,因此每次都必须重新准备它,并且您需要为每次迭代构建新的执行计划.再次使用“编译”比喻,这就像一个C程序,其所有配置都是硬编码的 – 更改一个设置,您必须重新编译整个事物.
(进行批量插入时可能遇到的另一个主要成本是更新索引.如果您的表已编入索引,您可能希望尝试关闭它们,执行插入操作并重新打开它们以便只需重新编制索引一次而不是在每行添加之后.)