【问题标题】:Insert Into: Is one syntax more optimal or is it preference?插入:一种语法更优化还是偏好?
【发布时间】:2008-10-10 21:50:05
【问题描述】:

SQL Server (2005/2008)

以下每个语句都有相同的结果。有谁知道一个是否优于另一个?

insert into SOMETABLE 
  values ('FieldOneValue','FieldTwoValue',3,4.55,'10/10/2008 16:42:00.000')

insert into SOMETABLE 
  select 'FieldOneValue','FieldTwoValue',3,4.55,'10/10/2008 16:42:00.000'

insert into SOMETALBE
  Select
    Field1 = 'FieldOneValue',
    Field2 = 'FieldTwoValue',
    Field3 = 3,
    Field4 = 4.55,
    Field5 = '10/10/2008 16:42:00.000'

当然假设数据类型与表适当匹配...

【问题讨论】:

    标签: sql performance optimization insert


    【解决方案1】:

    我认为,基于这个问题,你到了premature optimization 的地步。如果您只是插入 1 条记录,我会坚持使用标准的 insert () values () 并让 Sql Server 团队使其性能最高。

    【讨论】:

    • 我同意这是过早的优化。还有许多其他更重要的性能问题。但是,如果问题是批量加载大量行,则通常最好使用特定于供应商的功能,例如 MySQL 的 LOAD DATA INFILE,因为它们的性能要好得多。
    • 我实际上并没有过早地优化。我根本没有优化,我只是在基本层面上对性能感到好奇,这在所有情况下似乎都可以忽略不计。
    • 没错,这是未成熟的优化。
    • 哇——小心声称有人在进行过早的优化,因为这是许多程序员都知道(适当地)避免的事情。我发现这个问题是因为我对是否存在差异感兴趣,但我想知道的原因是因为我发现 INSERT ... SELECT ... 语法更清晰,因为我可以为每一列设置别名,以便查询是自记录的(即我可以很容易地分辨出哪些值被插入到特定的列中)。这不是过早的优化。这只是很好的编码习惯!
    • 这不是问题的重点,问题是对于单次插入“哪个表现更好”。您可以通过使用 cmets 或参数而不是 select 语句来完成相同级别的编码,并使其具有描述性。
    【解决方案2】:

    我刚刚测试了这个。

    这两种方法在两组硬件上进行了 500 万次迭代,一组是 16GB RAM 的服务器,一组是 1GB 的笔记本电脑。

    结果:它们看起来是一样的。

    这些查询计划相同,性能差异在统计上不显着。

    【讨论】:

      【解决方案3】:

      我怀疑如果存在性能差异,它会支持前者,尽管我怀疑是否存在。

      尽管如此,这是选择更清晰的版本(即使用 VALUES)提供可读性和可维护性优势的情况之一,这超过了可能微不足道的性能影响。如果您要指定所有值,请遵守通常的约定,以防其他人阅读代码,乍一看似乎是从另一个表执行 INSERT...SELECT,这是一种误导性的外观。

      【讨论】:

      • 我不确定我是否同意。假设我正在从 c# 应用程序中插入。这个查询将被反复使用,其中包含的值。对于维护我的代码的人来说,冗长的第三个版本可能比 Valuse() 版本更容易理解。
      • theo:你是对的,当然;我的意思是,坚持最干净、最清晰、最易读的东西,这可能因情况而异。
      【解决方案4】:

      对于 SQL Server,只需使用此模式

      INSERT INTO TableName (fieldList) 选择(值列表/列列表) [FROM 等]

      这是您唯一需要的插入模式。它无所不能。请指定 fieldlist 以保护您的语句免受未来表更改(添加可选列的位置)。

      使用 INSERT INTO VALUES 有一些细微差别,我不记得了,因为我不必这样做。

      【讨论】:

      • 没有 FROM 子句的 SELECT 语法不是标准 SQL。有几个品牌确实支持它,但不是全部。
      【解决方案5】:

      看起来你只是在模仿

      INSERT into SOMETABLE
      (
      SELECT * FROM SOMEOTHERTABLE
      )
      

      【讨论】:

        【解决方案6】:

        忽略这条评论,这是错误的。对此感到抱歉:(

        我知道当您输入多行时,您不能使用 INSERT VALUES()。

        插入表格 SELECT 1, 2, 3, (SELECT 4 FROM Table2 WHERE columnA = columnB)

        【讨论】:

        • SQL Server 是这样吗?其他 RDBMS 允许您这样做:INSERT INTO table values ('a1','a2'), ('b1','b2');
        • @Miles:不正确。标准 SQL 和大多数实现都支持多行的 INSERT。
        • 我的错,我认为我之前尝试过的语法是正确的,但我无法让它工作...... :*(
        猜你喜欢
        • 1970-01-01
        • 2016-07-11
        • 2022-01-19
        • 2011-03-25
        • 2010-10-17
        • 1970-01-01
        • 2014-10-05
        相关资源
        最近更新 更多