2012-07-13 50 views
4

我有以下查詢:插入與ORDER BY更快

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「按訂單」的操作確實的,無論如何,但比我

+4

什麼意思是更優化?和「爲什麼現在有效?」這是否意味着什麼不起作用? – Mark 2012-07-13 16:07:00

+0

除了馬克的重要問題之外,它還有多快?差異是否足夠重要? – hatchet 2012-07-13 16:13:08

+0

將'that'閱讀爲'than',這是有道理的。 – 2012-07-13 16:13:58

回答

0

表table2中的值列是否有任何非聚簇索引?你在表上的值子句上有聚簇索引嗎?我可以看到兩個可能的原因。

1.列值有非某種非聚集索引,所以優化器會選擇這個索引並避免排序(它也可能是一個覆蓋索引,在這種情況下它會非常快)。沒有任何順序的查詢沒有選擇該索引的原因是因爲它是一個簡單的查詢並且沒有發生優化,並且它進行了聚集索引或表掃描,然後對數據進行排序,並且與排序相比,導致性能下降。這是最有可能的反應。

  1. 另一個原因可能是,在插入數據它插入數據,因爲它得到,然後如果數據是有序和ORDER BY列相同的聚集索引。沒有頁面拆分,事情會很好。但如果沒有排序,那麼值將被隨機插入,導致頁面拆分,這會略微降低性能。但是,OP已經提到優化器在插入之前做了排序,這意味着這種情況在這裏不適用。
2

插入性能取決於你有多少個指標都和哪些列少高性能。如果table.field上有聚簇索引,則插入未排序的值非常昂貴(值不按field排序)。

+0

SQL Server可以添加一個排序到計劃'DMLRequestSort'但考慮到這一點。 – 2012-07-13 16:23:23

+0

@Martin Smith:我同意,很可能優化器會照顧它。但是,我不認爲這是有保證的;如果源列上沒有索引,則可能決定排序本身更昂貴。無論如何,如果我可以用SQL來表達它,我寧願給優化器更少的工作。 – a1ex07 2012-07-13 17:02:17