Время ожидания большого запроса в ASP.Net. Стратегия оптимизации?
У меня большой запрос, который я хотел бы попробовать и упростить. Это работает через большое количество данных и тайм-аутов.
Есть ли лучший способ предварительно загрузить данные из объединенных таблиц или что-то в этом роде?
Это хранимая процедура, которую я использую в отчете ObjectDataSource и SQL Server SSRS.
Любые идеи были бы отличными, спасибо!
create PROCEDURE [dbo].[LatestActivityByOwner]
@OwnerId uniqueidentifier
AS
SET NOCOUNT ON
SELECT
UserSettings.UserId,
UserSettings.FirstName,
UserSettings.LastName,
UserSettings.Email,
UserSettings.OwnerId,
MAX(Notes.CreatedDate) AS NoteLatestCreatedDate,
MAX(Tasks.CreatedDate) AS TaskLatestCreatedDate,
MAX(Schedules.CreatedDate) AS ScheduleLatestCreatedDate
FROM
UserSettings WITH (NOLOCK) LEFT OUTER JOIN
Schedules WITH (NOLOCK) ON UserSettings.UserId = Schedules.UserId LEFT OUTER JOIN
Tasks WITH (NOLOCK) ON UserSettings.UserId = Tasks.UserId LEFT OUTER JOIN
Notes WITH (NOLOCK) ON UserSettings.UserId = Notes.UserId
WHERE UserSettings.OwnerId = @OwnerId
GROUP BY
UserSettings.UserId,
UserSettings.FirstName,
UserSettings.LastName,
UserSettings.Email,
UserSettings.OwnerId
ORDER BY
UserSettings.LastName
1 ответ
Это звучит так, как будто вы должны на первом шаге отфильтровать большую таблицу, попробуйте что-то вроде этого:
SELECT *
INTO #TempSettings
FROM UserSettings
WHERE UserSettings.OwnerId = @OwnerId
SELECT
T.UserId,
T.FirstName,
T.LastName,
T.Email,
T.OwnerId,
MAX(Notes.CreatedDate) AS NoteLatestCreatedDate,
MAX(Tasks.CreatedDate) AS TaskLatestCreatedDate,
MAX(Schedules.CreatedDate) AS ScheduleLatestCreatedDate
FROM
#TempSettings T WITH (NOLOCK) LEFT OUTER JOIN
Schedules WITH (NOLOCK) ON T.UserId = Schedules.UserId LEFT OUTER JOIN
Tasks WITH (NOLOCK) ON T.UserId = Tasks.UserId LEFT OUTER JOIN
Notes WITH (NOLOCK) ON T.UserId = Notes.UserId
WHERE T.OwnerId = @OwnerId
GROUP BY
T.UserId,
T.FirstName,
T.LastName,
T.Email,
T.OwnerId
ORDER BY
T.LastName
drop table #TempSettings
Я думал: есть ли у вас конкретная причина использовать левое соединение? внутренние соединения быстрее
#TempSettings T WITH (NOLOCK) Inner JOIN
Schedules WITH (NOLOCK) ON T.UserId = Schedules.UserId inner
join Tasks WITH (NOLOCK) ON T.UserId = Tasks.UserId inner
Join Notes WITH (NOLOCK) ON T.UserId = Notes.UserId