У меня возникают промежуточные тайм-ауты при вызове этой хранимой процедуры из внешней среды ASP.NET на производственном сайте. он возвращает следующее исключение sql:
Сведения об исключении: System.Data.SqlClient.SqlException: истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.
Забавно то, что при выполнении этой процедуры на сервере или с удаленного компьютера с помощью Management Studio она выполняется за 6 секунд. Но тем не менее, иногда истекает время ожидания при выполнении из приложения ASP.NET? Можно ли улучшить этот запрос? Или эта проблема связана с чем-то другим? Кто может помочь? Я читал несколько тем об увеличении тайм-аута и включении пула в строке подключения в моем web.config, но еще не пробовал этого.
ALTER PROCEDURE [dbo].[Report_Activity]
(
@StartDate DATETIME
, @EndDate DATETIME
, @TotalActions INT OUTPUT
)
AS
BEGIN
SELECT @TotalActions = COUNT(EventHistoryId)
FROM dbo.SessionEventHistory
WHERE DateCreated BETWEEN @StartDate AND @EndDate
SELECT EventDescription, COUNT(EventHistoryId) AS EventCount
FROM dbo.SessionEventHistory
WHERE DateCreated BETWEEN @StartDate AND @EndDate
GROUP BY EventDescription
ORDER BY EventDescription
СХЕМЫ SQL:
CREATE TABLE [dbo].[SessionEventHistory](
[EventHistoryID] [int] IDENTITY(1,1) NOT NULL,
[SessionHistoryID] [int] NOT NULL,
[CategoryID] [int] NULL,
[UserName] [nvarchar](50) NULL,
[IPAddress] [nvarchar](20) NOT NULL,
[EventDescription] [nvarchar](1000) NOT NULL,
[EventData] [varbinary](max) NULL,
[DateCreated] [datetime] NOT NULL,
CONSTRAINT [PK_UserEventHistory] PRIMARY KEY CLUSTERED
(
[EventHistoryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SessionEventHistory] ADD CONSTRAINT [DF_UserEventHistory_DateCreated] DEFAULT (getdate()) FOR [DateCreated]
GO
Таблица имеет 3 индекса:
/****** Object: Index [IX_SessionEventHistory_SessionHistoryId_CategoryId] Script Date: 07/04/2012 10:47:06 ******/
CREATE NONCLUSTERED INDEX [IX_SessionEventHistory_SessionHistoryId_CategoryId] ON [dbo].[SessionEventHistory]
(
[SessionHistoryID] ASC,
[CategoryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
/****** Object: Index [IX_SessionEventHistory_UserName_DateCreated] Script Date: 07/04/2012 10:47:09 ******/
CREATE NONCLUSTERED INDEX [IX_SessionEventHistory_UserName_DateCreated] ON [dbo].[SessionEventHistory]
(
[UserName] ASC,
[DateCreated] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
/****** Object: Index [PK_UserEventHistory] Script Date: 07/04/2012 10:47:14 ******/
ALTER TABLE [dbo].[SessionEventHistory] ADD CONSTRAINT [PK_UserEventHistory] PRIMARY KEY CLUSTERED
(
[EventHistoryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ИЗМЕНИТЬ
Я добавил следующий указатель, все в порядке?
CREATE NONCLUSTERED INDEX [IX_SessionEventHistory_DateCreated] ON [dbo].[SessionEventHistory]
(
[DateCreated] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
DateCreated
в качестве ведущего столбца. Таким образом, если запрос также не включает предложение или группу where, включая столбецUserName
, вы должны увидеть в плане выполнения, что этот индекс не используется для удовлетворения этого запроса. - person Aaron Bertrand   schedule 04.07.2012