【问题标题】:insert with order by is faster按顺序插入更快
【发布时间】:2012-07-13 12:29:38
【问题描述】:

我有以下疑问:

 INSERT INTO table(field, field1)
 SELECT value, value1  FROM table2 e 
 ORDER BY value

比这个花费的时间更少:

 INSERT INTO table(field, field1)
 SELECT value, value1  FROM table2 e 

有人知道为什么吗?

第二个的执行计划显示sql无论如何都做了“order by”操作,但性能不如我的

【问题讨论】:

标签: sql-server optimization insert


【解决方案1】:

插入性能取决于您有多少索引以及哪些列。如果table.field 上存在聚集索引,则插入未排序的值非常昂贵(未按field 排序的值)。

【讨论】:

  • SQL Server 可以将排序添加到计划 DMLRequestSort 以考虑到这一点。
  • @Martin Smith:我同意,优化器很可能会处理它。但是,我认为不能保证。如果源列上没有索引,它可能会决定排序本身更昂贵。无论如何,如果我可以用 SQL 来表达,我宁愿给优化器更少的工作。
【解决方案2】:

表 table2 中的 value 列是否有任何非聚集索引?您是否在值子句上的表上有聚集索引?我可以看到两个可能的原因。

1. 列值上有某种非聚集索引,以便优化器选择该索引并避免排序(它也可以是覆盖索引,在这种情况下它会非常快)。没有任何 order by 的查询没有选择该索引的原因是因为它是一个简单的查询,没有发生任何优化,它进行了聚集索引或表扫描,然后对数据进行排序,与 order by 相比,导致性能下降.这是最可能的原因。

  1. 另一个原因可能是,在插入数据时,它会在获取数据时插入数据,然后如果数据是按列排序的并且相同的聚集索引按列排序。没有页面拆分,一切都会好起来的。但是如果没有排序,则将随机插入值,这可能会导致页面拆分,这会稍微降低性能。但是,OP 已经提到优化器在插入之前进行了排序,这意味着这种情况在这里不适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多