0

我昨天執行的更新語句大致如下:在已有聚簇索引的字段上放置非聚簇索引時,性能是否會提高?

UPDATE MainTable 
Set SomeField = SubsetTable.SomeField 
where MainTable.MainTableKey = SubsetTable.MainTableKey 

其中SubsetTableMainTable一個子集,並且具有相同的主鍵字段。 MainTable大約有200m記錄,SubsetTable有5m記錄。 MainTableKey是一個GUID。

這兩個表在MainTableKey上都有一個聚集索引。

當我第一次執行這個查詢花了14個小時。

然後我在這兩個表上添加了一個非聚集索引MainTableKey。現在需要30分鐘。

有沒有人有任何想法,爲什麼性能增益會如此戲劇性?

第一個查詢合併聯接其中涉及完全讀兩個表:

+2

比較執行計劃! –

+0

你使用了哪個數據庫?有關性能的問題與數據庫高度相關。 –

+0

SQL Server 2008 R2。對不起,只是更新了標籤 – Karl

回答

1

,如果你看的執行計劃我敢打賭。

200M rows + 5M rows = 205M rows. 
205M rows/14 hours = 4067 rows per second. 

第二個查詢是一個嵌套循環連接,它讀取整個小表併爲每個小錶行尋找大表。

5M + 5M rows = 10M rows. 
10M rows/40 minutes = 4166rows per second. 

這些比率大致相等,支持我關於哪些行被讀取的理論。

您不必猜測:使用SET STATISTICS IO ON運行查詢,和/或查看執行計劃。

相關問題