代码之家  ›  专栏  ›  技术社区  ›  luvieere

为什么使用参数化查询向表中插入数据比向查询字符串中追加值要快?

  •  6
  • luvieere  · 技术社区  · 16 年前

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

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

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

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

    ?

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

    5 回复  |  直到 16 年前
        1
  •  8
  •   Dave Sherohman    16 年前

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

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

    (在执行大规模插入时,您可能会遇到的另一个主要成本是更新索引。如果您的表已编制索引,您可能希望尝试关闭它们、执行插入并重新启用它们,以便只需重新编制索引一次,而不必在添加每行之后重新编制索引。)

        2
  •  5
  •   Tomek Szpakowicz    16 年前

    简单。分析和准备查询的执行计划需要很多时间,甚至在查询执行开始之前。

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

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

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

        3
  •  4
  •   RickNZ    16 年前

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

        4
  •  3
  •   Adriaan Stander    16 年前

    这是因为数据库缓存了查询计划,这使得查询速度更快。

    有关Sql server,请参见以下说明

    Execution Plan Caching and Reuse

        5
  •  0
  •   paparazzo    9 年前

    我打赌如果使用多个值,速度不会更快

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