2011-05-02 151 views
2

我有一個存儲過程,似乎是我的應用程序中的瓶頸。問題在於它所使用的表格更新頻繁(每秒大約一次記錄一次) - 所以索引不是微不足道的。SQL索引問題

似乎對於SP的每一次X運行 - 有一次運行需要大約1.5秒(其他運行約300-400ms或更少)。在我的解釋中,索引樹正在更新。

RBDMS是SQL Server 2008 R2。

這裏是SP:

的PK存檔和現場表「PK1」(例如) - 這是不被用在這裏。

的FK是用戶ID(這是一個Table_Users PK)

INSERT INTO Table_Archive 
     SELECT userid, longitude, latitude, direction, RcvDate 
     FROM Table_Live 
     WHERE userid = @userid 

DELETE FROM Table_Live WHERE userid = @userid 

-- write down the new location 

INSERT INTO 
     Table_Live (userid, longitude, latitude, direction) 
    VALUES (@userid, @lon, @lat, @dir) 

UPDATE Table_Users 
    SET location = 'true' 
    WHERE loginid = (SELECT MAX(loginid) as loginid 
        FROM Logins 
        WHERE userid = @userid) 

任何想法,什麼可以做,使之達到最佳運行狀態?最好應該在200ms以下運行。

+0

@marc_s - 所有錶行都在第一條語句中顯示。存檔和實時表的相同行。 – Roman 2011-05-02 07:53:23

+0

@marc_s - 存檔表的數百萬行和Live表的數千行。 – Roman 2011-05-02 07:53:53

+0

是的 - 但**類型**是那些列?那些**全**列?哪些指數已經在plcae? – 2011-05-02 07:53:54

回答

0

唯一明顯的情況是:有loginiduserid的指數Table_Users

兩者都被用於在UPDATE語句的WHERE子句中,也有適用於loginid

另一件事一MAX()功能,這將有助於頗有幾分:實際上不刪除存儲過程中的行。這會爲你節省很多時間。嘗試異步執行更新 - 與數據庫分開。例如。將@userid值寫入「命令​​表」並讓SQL作業刪除這些行,例如每小時一次左右。

+0

當然還有:) – Roman 2011-05-02 07:58:46

+0

插入後添加了幾個索引後,它不能成爲B樹嗎? – Roman 2011-05-02 07:59:39

+0

@roman:否 - 它可能是更新統計數據或類似的東西 - 偶爾會發生這種情況 – 2011-05-02 08:00:35

1

不是正在更新索引樹:發生在ACID的一部分。當DML完成時,所有內部結構(包括索引,檢查,外鍵檢查等)也將完成。 SQL Server中沒有推遲進行這種檢查

這可能是統計信息更新和編譯時間(更新統計信息時計劃失效)。統計信息更新(IIRC)是由500行+ 20%的更改引起的。因此,對於如果要插入「每秒幾十行的」對錶「成千上萬」行,你就需要統計刷新

我首先想到的是設置asynchronous statistics禁用它們

+0

ooohh ....那是一個非常糟糕的:)試過 - 在某些場合幾乎增加了一倍的查詢時間(不知何時)。不知道這是怎麼回事... – Roman 2011-05-02 20:11:58