In addition to some general advice on optimizing, I have a more specific question as well. I have a messaging system where users can leave private messages for other users.Here is my table info:CREATE TABLE [dbo].[Message] ([MessageID] [int] IDENTITY (1, 1) NOT NULL ,[OutboxUserID] [int] NOT NULL ,[InboxUserID] [int] NOT NULL ,[MessageSubject] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,[Message] [varchar] (3000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,[MessageTime] [smalldatetime] NOT NULL ,[MessageResponseID] [int] NULL ) ON [PRIMARY]GOALTER TABLE [dbo].[Message] WITH NOCHECK ADD CONSTRAINT [PK_Message] PRIMARY KEY CLUSTERED ( [MessageID] ) WITH FILLFACTOR = 90 ON [PRIMARY] GOALTER TABLE [dbo].[Message] ADD CONSTRAINT [DF_Message_MessageTime] DEFAULT (getdate()) FOR [MessageTime]GOALTER TABLE [dbo].[Message] ADD CONSTRAINT [FK_MessageInbox_UserAccount] FOREIGN KEY ( [InboxUserID] ) REFERENCES [dbo].[UserAccount] ( [UserID] ), CONSTRAINT [FK_MessageOutbox_UserAccount] FOREIGN KEY ( [OutboxUserID] ) REFERENCES [dbo].[UserAccount] ( [UserID] )GO
This table gets queried a lot, via 3 differents SPROCS:CREATE PROCEDURE MessageThread_LIST@ModelUserID int,@MemberUserID intASSELECT TOP 100 PERCENT MessageID, InboxUserID, OutboxUserID, MessageSubject, Message, MessageTimeFROM dbo.MessageWHERE (InboxUserID = @ModelUserID) AND (InboxUserID = @MemberUserID) OR (InboxUserID = @ModelUserID) AND (OutboxUserID = @MemberUserID) OR (InboxUserID = @MemberUserID) AND (OutboxUserID = @ModelUserID) OR (OutboxUserID = @ModelUserID) AND (OutboxUserID = @MemberUserID)ORDER BY MessageID DESCGOCREATE PROCEDURE ModelOutbox_LIST@MessageID int = NULL,@ModelID int = NULL,@ModelUserID int = NULL,@MemberID int = NULL,@MemberUserID int = NULLASSELECT TOP 100 PERCENT dbo.Message.MessageID, dbo.ModelAccount.ModelID, dbo.ModelAccount.UserID AS ModelUserID, dbo.ModelAccount.ModelName, dbo.ModelAccount.ModelPictureFile, dbo.MemberAccount.MemberID, dbo.MemberAccount.UserID AS MemberUserID, UserAccount_1.UserFirstName, dbo.MemberAccount.MemberPictureFile, dbo.Message.MessageSubject, dbo.Message.Message, dbo.Message.MessageTime FROM dbo.Message INNER JOIN dbo.UserAccount ON dbo.Message.OutboxUserID = dbo.UserAccount.UserID INNER JOIN dbo.UserAccount UserAccount_1 ON dbo.Message.InboxUserID = UserAccount_1.UserID INNER JOIN dbo.ModelAccount ON dbo.UserAccount.UserID = dbo.ModelAccount.UserID INNER JOIN dbo.MemberAccount ON UserAccount_1.UserID = dbo.MemberAccount.UserID WHERE (dbo.Message.MessageID = COALESCE(@MessageID,dbo.Message.MessageID)) AND (dbo.ModelAccount.ModelID = COALESCE(@ModelID,dbo.ModelAccount.ModelID)) AND (dbo.ModelAccount.UserID = COALESCE(@ModelUserID,dbo.ModelAccount.UserID )) AND (dbo.MemberAccount.MemberID = COALESCE(@MemberID,dbo.MemberAccount.MemberID)) AND (dbo.MemberAccount.UserID = COALESCE(@MemberUserID,dbo.MemberAccount.UserID))ORDER BY dbo.Message.MessageID DESCCREATE PROCEDURE MemberOutbox_LIST@MessageID int = NULL,@ModelID int = NULL,@ModelUserID int = NULL,@MemberID int = NULL,@MemberUserID int = NULLASSELECT TOP 100 PERCENT dbo.Message.MessageID, dbo.ModelAccount.ModelID, dbo.ModelAccount.UserID AS ModelUserID, dbo.ModelAccount.ModelName, dbo.ModelAccount.ModelPictureFile, dbo.MemberAccount.MemberID, dbo.MemberAccount.UserID AS MemberUserID, UserAccount_1.UserFirstName, dbo.MemberAccount.MemberPictureFile, dbo.Message.MessageSubject, dbo.Message.Message, dbo.Message.MessageTime FROM dbo.Message INNER JOIN dbo.UserAccount ON dbo.Message.InboxUserID = dbo.UserAccount.UserID INNER JOIN dbo.UserAccount UserAccount_1 ON dbo.Message.OutboxUserID = UserAccount_1.UserID INNER JOIN dbo.ModelAccount ON dbo.UserAccount.UserID = dbo.ModelAccount.UserID INNER JOIN dbo.MemberAccount ON UserAccount_1.UserID = dbo.MemberAccount.UserID WHERE (dbo.Message.MessageID = COALESCE(@MessageID,dbo.Message.MessageID)) AND (dbo.ModelAccount.ModelID = COALESCE(@ModelID,dbo.ModelAccount.ModelID)) AND (dbo.ModelAccount.UserID = COALESCE(@ModelUserID,dbo.ModelAccount.UserID )) AND (dbo.MemberAccount.MemberID = COALESCE(@MemberID,dbo.MemberAccount.MemberID)) AND (dbo.MemberAccount.UserID = COALESCE(@MemberUserID,dbo.MemberAccount.UserID))ORDER BY dbo.Message.MessageID DESCGO
Lately I have been getting a lot of Timeout expired errors from the DB when running the SPROCS.What can I do to improve the speed and reliability of the table/queries?Thanks!