reporting-services - SSRS 报告运行缓慢
问题描述
使用 Report Builder 3.0,我有一个使用以下数据集的报告:
Declare @Hierarchy nVarChar (1000) = EAC.GetHierarchy (@UserName, DEFAULT)
SELECT TOP(100)
CASE
WHEN @ShowSourceTime = 1 THEN SourceTime
ELSE Dateadd(Minute, @TimeZoneOffset, Time)
END as Time
,Warehouse.EventInfo.TimeZoneShortName
,Warehouse.EventInfo.Category
,Warehouse.EventInfo.[Action]
,Warehouse.EventInfo.[Result]
,Warehouse.EventInfo.Reason
,Warehouse.EventInfo.PersonId
,Warehouse.EventInfo.Title
,Warehouse.EventInfo.FirstName
,Warehouse.EventInfo.MiddleName
,Warehouse.EventInfo.LastName
,Warehouse.EventInfo.Suffix
,Warehouse.EventInfo.Nickname
,Warehouse.EventInfo.DoorName
,Warehouse.EventInfo.DoorBehaviorName
,Warehouse.EventInfo.EnterZone
,Warehouse.EventInfo.LeaveZone
,Warehouse.EventInfo.SiteCode
,Warehouse.EventInfo.CardCode
,Warehouse.EventInfo.SiteCode + '-' + Warehouse.EventInfo.CardCode as Badge
FROM
Warehouse.EventInfo
WHERE
Warehouse.EventInfo.[Time] Between @StartTime and @EndTime
AND (1 = @PersonIdExpr OR EventInfo.PersonId IN (@PersonId))
AND WareHouse.EventInfo.ZoneHierarchy LIKE @Hierarchy
order by Time
The dataset is calling the view below:
SELECT EAC.Event.CreatedUTC AS Time
,DATEADD(MINUTE, EAC.Event.CreatedUTCOffset
, EAC.Event.CreatedUTC) AS SourceTime
, EAC.TimeZoneMap.TimeZoneShortName
, EAC.EventClass.Name AS Class
, EAC.EventCategory.Name AS Category
, EAC.EventAction.Name AS Action
, EAC.EventResult.Name AS Result
, EAC.EventReason.Name AS Reason
, EAC.Person.Id AS PersonId
, EAC.Person.Title
, EAC.Person.FirstName
, EAC.Person.MiddleName
, EAC.Person.LastName
, EAC.Person.Suffix
, EAC.Person.DisplayName AS Nickname
, EAC.Door.Name AS DoorName
, Zone_1.Name AS EnterZone
, (SELECT TOP (1) Name
FROM EAC.Zone
WHERE (Id IN (EAC.Door.Zone1Id, EAC.Door.Zone2Id))
AND (Id <> EAC.Event.ZoneId)) AS LeaveZone
, EAC.DoorBehavior.Name AS DoorBehaviorName
, EAC.Event.CardCode
, EAC.Event.SiteCode
, ISNULL(EAC.Event.Alarmed, 0) AS AlarmType
, Zone_1.ZoneHierarchy
FROM EAC.Event
INNER JOIN EAC.EventType ON EAC.EventType.Id = EAC.Event.EventTypeId
LEFT OUTER JOIN EAC.EventClass ON EAC.EventClass.Id = EAC.Event.EventClassId
LEFT OUTER JOIN EAC.EventCategory ON EAC.EventCategory.Id = EAC.EventType.CategoryId
LEFT OUTER JOIN EAC.EventAction ON EAC.EventAction.Id = EAC.EventType.ActionId
LEFT OUTER JOIN EAC.EventResult ON EAC.EventResult.Id = EAC.EventType.ResultId
LEFT OUTER JOIN EAC.EventReason ON EAC.EventReason.Id = EAC.EventType.ReasonId
LEFT OUTER JOIN EAC.Person ON EAC.Person.Id = EAC.Event.PersonId
LEFT OUTER JOIN EAC.Door ON EAC.Door.Id = EAC.Event.DoorId
LEFT OUTER JOIN EAC.Zone AS Zone_1 ON Zone_1.Id = EAC.Event.ZoneId
LEFT OUTER JOIN EAC.DoorBehavior ON EAC.DoorBehavior.Id = EAC.Door.DoorBehaviorId
LEFT OUTER JOIN EAC.Credential ON EAC.Credential.Id = EAC.Event.CredentialId
LEFT OUTER JOIN EAC.WiegandCredential ON EAC.WiegandCredential.CredentialId = EAC.Credential.Id
LEFT OUTER JOIN EAC.TimeZoneMap on EAC.TimeZoneMap.Id = EAC.Door.TimeZoneMapId
它正在查询的表有数百万条记录,但为了得到任何返回,我将其限制为 100 条记录,但仍需要 15 分钟。
当我运行报告时,我在数据库中看到了这个:
这是执行计划: 执行计划
我可以做些什么来使这个报告更有效地运行?
解决方案
有了这么多LEFT OUTER JOIN
,您的查询运行缓慢也就不足为奇了。每个连接都会给您的代码带来复杂性。此外,LEFT|RIGHT [OUTER] JOIN
它比常规连接慢得多,因为它必须完成 INNER JOIN(常规连接)的所有工作以及对结果进行空值扩展的额外工作。
此外,如果没有查看查询的解释计划,就不可能发表评论或查明问题。可能您缺少表上的索引
推荐阅读
- java - Hibernate - 使用唯一键映射多对多连接表
- html - 更改已经具有 div 容器和 div 行的引导模板
- php - 在 Laravel 8 中运行 Laravel 4 Eloquent 查询时出错
- css - 如何在 ReactJS 中显示带有 CSS 的图像?
- javascript - 在javascript中,是否有一种简单的方法可以从其中一行中获取表格元素?
- java - 如何解决字符串集成到我的代码
- python-3.x - 通过 Xarray 保存 NetCDF,尺寸由两个坐标给出
- kubernetes - kubectl exec 错误拨号后端:x509:证书由未知机构签名
- r - 用列的平均值计算数据虹膜
- python - 区间 [0,360] 中两个向量之间的角度