Время ожидания большого запроса в 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
Другие вопросы по тегам