У меня есть большая таблица базы данных (SQL Server 2008), в которой хранятся все мои сообщения на форуме (в настоящее время в таблице содержится более 4,5 миллионов записей).
это схема таблицы:
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
ошибка, которую я получаю, выглядит следующим образом: «Тайм-аут истек. Время ожидания истекло дозавершение операции или сервер не отвечает "
Я искал план выполнения, и единственное, что выглядит подозрительно, это то, что запрос имеет стоимость около 75% -87% (это варьируется) при поиске ключа в таблице сообщений форума (что я не понимаю почему, потому что я настроил его как кластеризованный, поэтому я надеялся, что он будет намного более эффективным).Я всегда исходил из того, что при поиске по кластерному индексу запрос должен быть очень эффективным.
Есть ли у кого-нибудь идеи, как можно улучшить эту проблему и этот запрос, чтобы получить сообщение и его ответы?
Спасибо.