2015-09-15 62 views
0

我運行以下語句,它將更新超過9300萬行。如何優化查詢更新?

SET rowcount 10000 
update t 
    set [OC]=r.[OC] 
    from [dbo].[Vente] t 
    inner join [dbo].[OC] r 
    on t.[Date Time] between r.[DATE DEBUT] and r.[DATE FIN] 
while @@rowcount>0 
BEGIN 
update t 
    set [OC]=r.[OC] 
    from [dbo].[Vente] t 
    inner join [dbo].[OC] r 
    on t.[Date Time] between r.[DATE DEBUT] and r.[DATE FIN] 
end 
SET rowcount 0 

如何優化它? 。

+0

你有和索引第一更新增加後更改[約會時間]? –

+1

備註 - 設置像這樣的rowcount已過時: '使用SET ROWCOUNT不會影響將來版本的SQL Server中的DELETE,INSERT和UPDATE語句。避免在新的開發工作中使用SET ROWCOUNT和DELETE,INSERT和UPDATE語句,並計劃修改當前使用它的應用程序。對於類似的行爲,使用TOP語法.'(來自[MSDN](https://msdn.microsoft.com/en-us/library/ms188774.aspx)) – Bridge

+0

根據你的數據庫的使用情況(是否有其他用戶/會話?)可以關閉所有觸發器,刪除所有約束和索引並在更新後重新創建它們。 – Shnugo

回答

0

雖然有對T的指數[日期時間],我在與一個日數據的批量更新,是這樣的:

DECLARE @StartDate datetime 
      = r.[DATE DEBUT] FROM [dbo].[OC] r, 
     @EndDate datetime 
      = r.[DATE FIN] FROM [dbo].[OC] r 

WHILE @StartDate <= @EndDate 
BEGIN 
    update t 
    set [OC]=r.[OC] 
    from [dbo].[Vente] t 
    inner join [dbo].[OC] r 
    on t.[Date Time] = @StartDate 

    SELECT @NextDate = MIN(t.[Date Time]) 
    from [dbo].[Vente] t 
    inner join [dbo].[OC] r on t.[Date Time] between r.[DATE DEBUT] and r.[DATE FIN] 
    where t.[OC] <> r.[OC] 

    SET @StartDate = @NextDate 

END 

你可能需要做的日期時間字段一些轉換獲得一天。根據您的數據,您也可以考慮批量更新固定數量的行。

0

我覺得你的更新語句會無限循環,因爲每次都不排除更新的記錄。

爲了避免不必要的寫入,您需要添加一個條件到t [OC] <> r。[OC]。如果t.OC是假設爲空進行更新,而不是預期的,其中t。[α]爲空

嘗試使用MERGE語句