用索引提高脚本速度

时间:2013-04-15 17:10:41

标签: sql sql-server sql-server-2008-r2

我有以下脚本,但是由于我们的用户群现已扩展到近百万成员,因此脚本现在非常缓慢。我希望改进它,并需要专家协助,以便更快地实现这一点,无论是编码更改,创建索引,还是两者兼而有之。这是代码:

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

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分: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来了解一些可能的索引及其对应用程序工作负载的影响。

索引是一个很大的主题,您可能希望一次只采取一小步。