2016-05-30 34 views
1

我在SQL DB服務器中有一個表。 (表名:材料,6欄)。它包含260萬條記錄。我需要根據兩列值更新此表。爲了更新,系統需要2秒鐘。更新查詢需要2秒鐘來更新表格

請幫我看看如何優化下面的查詢。

UPDATE Material 
    SET Value = @Value, 
     Format = @Format, 
     SValue = @SValue, 
     CGroup = @CGroup 
WHERE 
    SM = @SM 
    AND Characteristic = @Characteristic 
+0

那麼是什麼問題,如果你有百萬數據,那麼簡單的邏輯就需要時間來更新? 2秒也不算太多時間。你是否在你的where子句中使用像主鍵列那樣的索引列。如果沒有,那會帶來好處。 – Ajay2707

+0

您可以通過提供查詢計劃來提高獲得有用答案的機會。 – Jeff

+0

因爲我會連續運行SQL查詢命令。每天我需要運行88000查詢來更新或插入此表中的行。如果一個單獨的查詢需要2秒鐘,那麼我不能每天運行88000個查詢。請幫助我。 (到Ajay2707) –

回答

2

您確實需要提供查詢計劃,然後才能確定地告訴您什麼可能有幫助。

話雖如此,我要檢查的第一件事是該計劃是否顯示了大量的時間進行表掃描。如果是這樣,如果在大表上添加SMCharacteristic上的索引,則可以大幅提高性能 - 這將允許分析器使用該索引執行索引查找而不是表掃描,並且可以顯着提高性能。

+0

我應該使用非CLUSTER索引SM和Charactersric嗎? –

+0

我的查詢計劃 我將持續運行SQL查詢命令。每天我需要運行88000查詢來更新或插入此表中的行。如果一個單獨的查詢需要2秒鐘,那麼我不能每天運行88000個查詢。請幫我在這 –

+0

@MuthukrishnanR我不知道。您必須考慮在其他情況下是否經常查詢表,它是否當前有聚集索引,以及向它們添加索引是否有意義。不過,如果它們不是唯一的,我會非常謹慎地將它作爲聚集索引,即使它們是我會謹慎的。 – Jeff

1

當你有大數據一些調整,可以提高查詢性能

(1)如果被索引進行更新列,刪除索引

(2)執行在小批量

更新
DECLARE @i INT=1 
WHILE(@i <= 10) 
    BEGIN 
     UPDATE TOP(20000) Material 
    SET Value = @Value, 
     Format = @Format, 
     SValue = @SValue, 
     CGroup = @CGroup 
WHERE 
    SM = @SM 
    AND Characteristic = @Characteristic 

    SET @[email protected] + 1 
    END 

(3)禁止刪除觸發器(如果有的話)

希望噸他的幫助!

+1

注意那個循環 - 因爲'SM'和'特性'沒有被更新,所以它可能只是不斷更新相同的行。刪除索引和觸發器顯然是有風險的舉動,在做這件事之前,你應該確保你知道所有分支 - 妥協可能是在更新時禁用索引,然後重新啓用它,如果你做了很多事情的更新。 – Jeff

+0

但是在這個查詢執行過程中,系統總是給予始終20000匹配的記錄。它將如何給其他記錄匹配? –

+0

「Where」子句假定在每個更新週期中都被更改?當第一個20000行被更新時,從結果集中跳過的那些行被挑選出來用於下一個更新批處理。 希望這是有道理的或正確的我,如果我失去了一些東西。 – Sami

1

試着把SM &的複合索引特徵化。通過這樣做,sql服務器將能夠更容易地選擇記錄。從操作上來說,Update是插入& delete.If的組合,如果您的表有更多的列,即使您不嘗試更新所有列,它也可能會降低更新速度。

步驟我喜歡

  1. 嘗試把綜合指數與SM &特色
  2. 嘗試重新創建一個表所需的列&使用其中加入曾經需要。
1

2.6密耳排不是那麼多。 2秒更新可能太多了。

話雖如此,更新時間可能取決於兩件事情。

首先,多少行正在更新一個更新命令,即它只是一行或一些較大的集?你不能做太多的事情,只是說它應該被考慮在內。

另一件事是索引 - 你可能有太多或不足夠。

如果表中缺少(SM,特性) - 或(特性,SM)上的索引(取決於選擇性) - 那麼它可能每次都是全表掃描。如果更新僅涉及幾行,那就浪費時間。所以,這是第一件要檢查的事情。

如果受影響的列上的索引太多,這也會降低更新速度,因爲必須隨每次更改數據來維護這些索引。你可以通過查詢sys.dm_db_index_usage_stats DMV(在網上有很多解釋,所以我不會在這裏進入)來檢查索引的有效性,並刪除未使用的。只要小心這一點,並徹底測試。

要檢查的另一件事是受影響的列是否是某些外鍵約束的一部分。在這種情況下,引擎必須每次檢查約束的有效性(低於,檢查引用表中是否存在新值,或者檢查引用表中是否有數據,具體取決於列的FK的哪一側)。如果此檢查沒有支持索引,則會導致(再次)對涉及的其他表進行掃描。

但要真正確定,請檢查exec計劃和IO統計信息(SET STATISTICS IO ON),它會告訴你到底發生了什麼。