如果有多个SELECT语句,SSRS报告的速度会非常慢



我已经浏览stackoverflow好几天了,毫无疑问,我发现我的问题有很多相似之处。但我仍然想分享我在使SSRS报告发挥作用方面所面临的问题。

我的设想是:我在文本编辑器中编写了3个SELECT语句来准备1个数据集。我用来填充tablix上的字段的数据集。请注意,这些精选语句并不那么复杂。尽管这些查询中的每3个都具有CCD_ 3和相应的CCD_。所有3个SELECT查询都被插入到一个temporary table中。

WHERE条件中,其中一个条件有一个子查询来比较MAX(date)值。并且另一个条件具有IIF(Expression, True, False)语句来评估between的日期范围。

以下是我实际查询的概要。

Create #TempTable(
col1 nvarchar(50),
col2 nvarchar(50),
col3 datetime,
col4 nvarchar(15)
)
declare @date date
set @date = '2020-09-12';
insert into #TempTable(col1, col2, col3, col4)
select
col1, col2, col3, col4
from table1 t1
left outer join tbl1 on t1.Id = tbl1.T1Id and col3 = (select MAX() from tbl1 where tbl1.status = 0)
left join tbl2 on t1.Id = tbl2.T1Id
where 
tbl2.createddate between 
IIF((t1.date is null) or (CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, @date)-1, 0))),
CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, @date)-1, 0)),
t1.date
) and CONVERT(DATE, DATEADD (DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @date), 0)))

类似地,我还有2个以上的select语句来准备数据集。

因此,我的疑问是,这个子查询和IIF((语句是否会成为使该报告速度减慢的原因如果是的话,如果我能在这里得到一些指导方针,我将不胜感激。

更有趣的是,它不返回大量的行。不超过10至20行。

这不是一个答案,但我还不能发表评论。在SSMS中运行查询并查看执行计划。即使您有索引,列周围的函数也会阻止索引的使用。即使返回了零条记录,也必须扫描该表。也许可以更改IIF中的逻辑来揭示列。即使你做不到,你也可以添加一些多余的、没有覆盖的东西。即使添加的内容不够选择性,无法满足您的需求,但它可能会避免扫描所有表并评估每条记录上的IIF逻辑。

要求是什么?也许还有另一种方法可以得到你需要的东西。对日期逻辑进行逆向工程会伤脑筋。此外,我看不到介于两者之间的AND。

覆盖索引的一个简单示例可能是向列中添加1天,并与getdate((进行比较。正确的方法是将该列与getdate((-1进行比较。

类型也很重要。与使用服务器的十几个繁忙应用程序相比,将char(1(列与N"进行比较的查询占用的资源更多。将其更改为非unicode"值在大多数情况下导致零逻辑读取-可以使用筛选后的索引。这是一个罕见的两个极端的例子——从最坏到最好。

最新更新