Sql 通过索引提高脚本速度

Sql 通过索引提高脚本速度,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有下面的脚本,以前还可以,但是由于我们的用户群现在已经扩展到近一百万个成员,脚本现在非常缓慢。我想改进它,需要专家的帮助来加快速度,要么修改编码,要么创建索引,要么两者兼而有之。代码如下: IF @MODE = 'CREATEREQUEST' BEGIN IF NOT EXISTS (SELECT * FROM FriendRequest WHERE FromMemberID = @FromMemberID AND ToMemberID = @ToMemberID)

我有下面的脚本,以前还可以,但是由于我们的用户群现在已经扩展到近一百万个成员,脚本现在非常缓慢。我想改进它,需要专家的帮助来加快速度,要么修改编码,要么创建索引,要么两者兼而有之。代码如下:

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

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

您可以使用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)
但是您应该知道,索引通常会减慢代码中显示的插入和更新操作。它通常会加速可以使用索引字段的SELECT查询(请参阅)

您可以尝试了解一些可能的索引及其对应用程序工作负载的影响


索引是一个大主题,您可能希望一次只做一小步。

请。您是否分析了此代码以确定运行缓慢的语句,以及执行计划是什么?如果不包括表定义、执行计划、,以及任何当前索引。还要告诉我们每个表中有多少行,以及“非常缓慢”的含义。仅供参考:PK不一定要聚集。请不要散布这两件事总是在一起的神话。