【发布时间】:2020-04-23 18:29:11
【问题描述】:
我正在寻找有关使用 SQL Server 时一些有趣问题的见解。
背景
- 我们在 APS (SQL Server PDW/MPP) 上运行的 SSRS 报告很少
- 具有嵌入式查询的报表数据集直接在数据库上运行。现在,其中一个较大的表已被拆分为“当前”和“历史”表(“当前”表有最近几年的数据),显然是为了提高这些报告的性能。
- 我需要更改 SSRS 报告,使相同的报告现在应该根据选择的“年份”作为参数之一重定向到这些表中的任何一个。
- 我的设计方法:我决定在 SSRS 报告数据集中使用数据库存储过程 (SP),在存储过程中构建所需的逻辑。
问题陈述
顺便说一下,多值参数不会像我想象的那样工作。
-
当我查看此问题时,这似乎是一个已知问题,并且是 SSRS 支持不佳的功能之一。似乎多值参数中的多个值仅被视为单个值,即使在打印时它们看起来像中的多个值
val1,val2,val3
然后我决定找到一些解决方法来使其正常工作,遵循上面和下面帖子中的一些建议。
-
经过多次尝试,我设法通过构建如下所示的逻辑来实现此功能
-
第一步:从SSRS,参数改成:
=Join(Parameters!param_1.Value,"|") -
Step2:使用SP中的一段代码对多值参数进行转换/格式化,并将其存储在一个新的变量(SQLString)中
--Relevant code: -- Block of conversion code -- to convert/format the multivalued param and store it in a new variable -- after this the SQLSTRING variable's final value is set as -- |val1|val2|val3| -- Relevant where clause AND (@SQLString LIKE '%|' + tbl.attr_1 + '|%')
-
成功了!虽然,警告提到这肯定不是高性能的。 SSRS 报告中的结果很快(尽管这只是一个示例查询)。
现在我决定将“转换代码块”转换为标量函数,如下所示,这样我就可以每次为每个多值参数调用此函数。 Link 4
这也有效,但太慢了(对于只有一个多值参数的相同示例查询,即一次调用此函数)。
问题
- 我很困惑(我对 SQL Server 内部知识了解不多)为什么将一段代码转换为函数会在这种程度上减慢查询执行速度。
不胜感激。
提前致谢。
【问题讨论】:
-
领先的通配符会扼杀性能。
-
从根本上说,像 PDW/MPP 这样的平台不应该要求这些前端杂技来获得所需的性能。该表正在此处“手动”分区。您应该能够使用分布、分区、有序 CCI、非聚集索引在后端透明地实现这一点。这个表有多少行?
-
@avery_larry 是的。但我不明白为什么。
-
@Nick.McDermaid 同意。决策者意识到这一点。但目前已决定将其作为临时解决方案。分布已经到位。并且报告查询在连接多个此类表时会利用这些分布。我将探讨其余部分(分区、有序 cci、非聚集索引)w.r.t。到APS上的这个模型。我在这些领域没有太多经验,在这里不胜感激。该表有 23.42 亿行(拆分为当前和历史之前)。
标签: sql-server reporting-services ssrs-2016