2013-06-22 51 views
1

我有2個表像減少時間:更新表時與左連接

-table1: id_1, id_2, id_3, ref_id (id_1, id_2 is pk) 
-table2: ref_id, id_4 

我想ID_3場應等於表2的ID_4(REF_ID是主鍵) table1的具有約6萬條記錄和表2有大約2700條記錄。

我寫了像SQL:

update table1 
set id_3 = b.id_3 
from table1 
left join table2 b on id_1= b.ref_id 

通過使用SQL Server查詢花費如此多的時間像約16小時,仍然沒有任何反應。我怎樣才能縮短查詢時間?

+0

你有索引列嗎?可能是在更新大量索引數據之前刪除一些索引的選項,然後重建索引 - 當然(如果不需要列值的強制唯一性)。 – CBroe

+0

我不認爲這花了這麼長時間,所以沒有索引。 – adaminasabi

回答

0

無論如何,更新一張600萬行表中的每一行都可能會很慢。以獲取更新的每一行的最大速度爲基準

一種方法是隻時間查詢:

update table1 
set id_3 = 100 

另外,你需要更新table1中不具有匹配的行表2中的行?在這種情況下,將左外部聯接切換到內部聯接將大大提高性能。

1

聽起來似乎確實花了很長時間,但缺乏指數可能是造成這一現象的原因。沒有索引,數據庫基本上必須遍歷6M記錄表中每條記錄的2700條記錄。

因此,首先在ref_id上添加一個索引(假設主鍵不是索引)並在id_1上添加一個索引。

爲了更容易監控(就進度而言),只需遍歷表2中的2700條記錄,並對每條記錄(或每10,100條等)進行更新,以便您可以更新部件並查看它有多遠。

此外,爲了確保你沒有做任何無用的,我會建議增加一個and table1.id_3 <> table2.id_3

0

要回答這個問題,我們真的需要知道在兩個表的聚集索引。我可以爲聚集索引提出建議,以便快速完成此特定查詢,但是,在選擇聚簇索引時應真正考慮其他因素。

考慮到這一點

於是,看見的,如果這些指標幫助:

表1:唯一聚集索引上(ID_1,ID_2) 表2:唯一聚集索引上(REF_ID)

基本上使你的PK聚集如果他們還沒有。

另一個重要的問題是表格是否在運行此更新時看到其他流量。如果是這樣,運行時間很長可能是由於阻塞。在這種情況下,您應該考慮批處理,即一次只更新一小部分,而不是單個語句中的全部。