我有一个大型查询,我想尝试简化。它正在处理大量数据并超时。
是否有更好的方法从连接的表中预加载数据或沿着这些行添加某些内容?
这是我通过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
答案 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