【发布时间】:2011-10-07 20:13:05
【问题描述】:
我有一个大型数据库表 (SQL Server 2008),其中存储了我的所有论坛消息(该表目前有超过 450 万个条目)。
这是表架构:
CREATE TABLE [dbo].[ForumMessage](
[MessageId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[ForumId] [int] NOT NULL,
[MemberId] [int] NOT NULL,
[Type] [tinyint] NOT NULL,
[Status] [tinyint] NOT NULL,
[Subject] [nvarchar](500) NOT NULL,
[Body] [text] NOT NULL,
[Posted] [datetime] NOT NULL,
[Confirmed] [datetime] NULL,
[ReplyToMessage] [int] NOT NULL,
[TotalAnswers] [int] NOT NULL,
[AvgRateing] [decimal](18, 2) NOT NULL,
[TotalRated] [int] NOT NULL,
[ReadCounter] [int] NOT NULL,
CONSTRAINT [PK_GroupMessage] PRIMARY KEY CLUSTERED
(
[MessageId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
我看到不断出现的一个问题是,当我运行选择一条消息及其所有回复的存储过程时,我有时会从 SQL 服务器收到超时错误。
这是我的存储过程:
select fm1.[MessageId]
,fm1.[ForumId]
,fm1.[MemberId]
,fm1.[Type]
,fm1.[Status]
,fm1.[Subject]
,fm1.[Body]
,fm1.[Posted]
,fm1.[Confirmed]
,fm1.[ReplyToMessage]
,fm1.[TotalAnswers]
,fm1.[AvgRateing]
,fm1.[TotalRated]
,fm1.[ReadCounter],
Member.NickName AS MemberNickName, Forum.Name as ForumName
from ForumMessage fm1 LEFT OUTER JOIN
Member ON fm1.MemberId = Member.MemberId INNER JOIN
Forum On fm1.ForumId = Forum.ForumId
where MessageId = @MessageId or ReplyToMessage=@MessageId
order by MessageId
我得到的错误如下所示:“超时已过期。在操作完成之前超时时间已过或服务器没有响应”
我正在查看执行计划,唯一看起来可疑的是,在 forummessage 表(我不明白为什么,因为我将它设置为集群,所以我希望它会更有效率)。我一直认为,当您搜索聚集索引时,查询应该非常有效。
有没有人知道我可以如何改进这个问题和这个查询以获取消息及其回复?
谢谢。
【问题讨论】:
-
能否在问题中包含执行计划?
-
为什么 loeft 加入,不是所有的消息都必须来自成员吗?
标签: sql sql-server stored-procedures timeout