2013-04-15 68 views
0

我有以下腳本,以前是可以的,但由於我們的用戶羣現已擴展到將近一百萬名成員,腳本現在非常緩慢。我想改進它,並需要專家的幫助,使其更快,無論是編碼更改,創建索引,或兩者。這裏是代碼:提高索引腳本的速度

IF @MODE = 'CREATEREQUEST' 
    BEGIN 
     IF NOT EXISTS (SELECT * FROM FriendRequest WHERE FromMemberID = @FromMemberID AND ToMemberID = @ToMemberID) 
     AND NOT EXISTS (SELECT * FROM MemberConnection WHERE MemberID = @FromMemberID AND ConnMemberID = @ToMemberID) 
     AND NOT EXISTS (SELECT * FROM MemberConnection WHERE MemberID = @ToMemberID AND ConnMemberID = @FromMemberID) 

     BEGIN 
      INSERT INTO FriendRequest (
       FromMemberID, 
       ToMemberID, 
       RequestMsg, 
       OnHold) 
      VALUES (
       @FromMemberID, 
       @ToMemberID, 
       @RequestMsg, 
       @OnHold) 
     END 
     BEGIN 
      UPDATE Member SET FriendRequestCount = (FriendRequestCount + 1) WHERE MemberID = @ToMemberID 
     END 
END 

任何援助,你可以提供將不勝感激。

+0

請[不要在您的帖子中使用簽名或標語](http://stackoverflow.com/faq#signatures)。 – meagar

+3

您是否分析了此代碼以識別緩慢運行的語句,以及執行計劃是什麼? – Pondlife

+2

如果您不包含**表定義,執行計劃和任何當前索引**,則無法查看可以進行哪些改進。 – JNK

回答

1

您可以使用SQL Server Management Studio查看錶上的索引。例如,如果FriendRequest表在FriendRequestID上具有PK,則您將能夠看到該字段上有聚集索引。每個表只能有一個聚簇索引,表記錄按該順序存儲。

您可能想嘗試將非聚集索引添加到您的外鍵字段。你可以使用新的索引向導,否則語法是這樣的:

CREATE NONCLUSTERED INDEX [IX_FromMemberID] ON [dbo].[FriendRequest] (FromMemberID) 
CREATE NONCLUSTERED INDEX [IX_ToMemberID] ON [dbo].[FriendRequest] (ToMemberID) 

但是你應該知道,索引通常會減慢INSERT和UPDATE操作你在你的代碼顯示。它通常傾向於加快可以使用索引字段的SELECT查詢(請參閱Execution Plans)。

您可以試試Database Engine Tuning Advisor以瞭解一些可能的索引及其對應用程序工作負載的影響。

索引是一個很大的主題,您可能希望一次只採取一小步。

+3

僅供參考:PK不一定非要聚集。請不要傳播這兩個東西總是在一起的神話。 –