2008-09-03 21 views
17

我有一個超過一個毫秒行的表。該表用於索引tiff圖像。每個圖像都有像date,number等字段。我有用戶可以批量索引這些圖像500.我需要知道是否最好先插入500行,然後執行500次更新,或者當用戶完成索引時,做500個插入所有數據。一個非常重要的事情是,如果我一開始就做500個插入,這次對我來說是免費的,因爲我可以在前一天晚上做到這一點。插入成本vs SQL Server中的更新

所以問題是:插入,插入和更新是否更好?爲什麼?我已經爲每張圖片定義了一個id值,並且我還在這些字段上有其他索引。

回答

25

Sql服務器中的更新導致幻影行 - 即Sql跨過一行並放入一個新行。劃掉的行在稍後刪除。

插入和更新都會以這種方式導致頁面拆分,它們都會有效地「添加」數據,只是更新會先標記舊的東西。

在此更新的基礎上,需要先查看行,這對於大量數據來說可能需要比更新更長的時間。

插入將幾乎總是更快,特別是如果他們要麼順序或如果基礎表沒有聚集索引。

當向表中插入大量數據時,請查看當前索引 - 它們可能需要一段時間才能更改和構建。在索引中間添加值總是比較慢。

你可以認爲它像追加到地址簿位:Z先生剛好可以加入到最後一頁,當你必須找到中間爲M.先生

1

我不是一個數據庫傢伙,但我想一次插入的插入會更快,因爲更新需要查找,而插入不需要。

+0

喬瓦尼空間,它也將取決於其他問題,如索引(聚簇或非聚簇)和填充因子。你的具體情況將在很大程度上影響你的進展。 – Galwegian 2008-09-03 14:59:52

2

先做插入,然後更新似乎是一個更好的主意有幾個原因。您將在低交易量時插入。由於插入的數據更多,現在是更好的時機。

由於您正在使用id值(可能是索引編制的)進行更新,所以更新的開銷將非常低。在更新期間,您的數據也會減少。

您也可以在批處理(500個插入/更新)級別關閉事務並將其用於每個單獨的記錄,從而減少一些開銷。

最後,在做出最終決定之前,測試一下以查看服務器上的實際性能。

1

每個查詢的執行計劃會告訴你哪一個應該更昂貴。真正的限制因素將是寫入磁盤,因此您可能需要在運行perfmon時運行一些測試,以查看哪些查詢導致更多寫入並導致磁盤隊列獲得最長(較長時間不好)。

1

這不是一個枯燥的問題。奎師那和Galegian的觀點是現貨。

對於更新,如果更新影響固定長度字段,影響將會減小。如果更新varchar或blob字段,則當新值超過舊值的長度時,可能會在更新期間添加頁面拆分的開銷。

1

我認爲插入會運行得更快。他們不需要查找(當你做一個更新時,你基本上是用where子句做相當於select的選擇)。另外,插入操作不會像更新那樣鎖定行,所以它不會干擾同時發生在表上的任何選擇。