ASP.Net中的大查询时间。优化策略?

时间:2015-12-11 23:01:09

标签: sql asp.net sql-server query-timeout

我有一个大型查询,我想尝试简化。它正在处理大量数据并超时。

是否有更好的方法从连接的表中预加载数据或沿着这些行添加某些内容?

这是我通过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 个答案:

答案 0 :(得分: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