我有以下脚本,但是由于我们的用户群现已扩展到近百万成员,因此脚本现在非常缓慢。我希望改进它,并需要专家协助,以便更快地实现这一点,无论是编码更改,创建索引,还是两者兼而有之。这是代码:
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 :(得分: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来了解一些可能的索引及其对应用程序工作负载的影响。
索引是一个很大的主题,您可能希望一次只采取一小步。