Performance 在mondrian mdx(Saiku CE)中搜索多个日期时出现性能问题

Performance 在mondrian mdx(Saiku CE)中搜索多个日期时出现性能问题,performance,mondrian,saiku,Performance,Mondrian,Saiku,我对蒙德里安比较陌生,我有一个问题,对我的球队来说,这似乎是一个阻碍比赛的问题 我们有一个简单的db,看起来像这样: WITH SET [~FILTER] AS {[Period].[Date Only].[2020-09-01], [Period].[Date Only].[2020-09-02]} SET [~ROWS_Members_First name] AS {[Members].[First name].[First name].Members} SET [~ROWS

我对蒙德里安比较陌生,我有一个问题,对我的球队来说,这似乎是一个阻碍比赛的问题

我们有一个简单的db,看起来像这样:

WITH
SET [~FILTER] AS
    {[Period].[Date Only].[2020-09-01], [Period].[Date Only].[2020-09-02]}
SET [~ROWS_Members_First name] AS
    {[Members].[First name].[First name].Members}
SET [~ROWS_Members_Last name] AS
    {[Members].[Last name].[Last name].Members}
SELECT
NON EMPTY {[Measures].[Measure1], ... [Measures].[Measure10]} ON COLUMNS,
NON EMPTY NonEmptyCrossJoin([~ROWS_Members_First name], [~ROWS_Members_Last name]) ON ROWS
FROM [Member]
WHERE [~FILTER]
  • 事实结果(成员id、期间id、大约10个简单度量)
  • dim_成员(id、名字、第二个名字)
  • 每日时段(id、日期、周、月、年等)
我们使用Mondrian 4(带Saiku CE)+PostgreSQL和ant,事实如下:

  • 对于8个月的数据来说,db仍然很小,大约10万个事实
  • 成员维度的名字和姓氏字段具有很高的基数(每个记录12k)
  • 来自mondrian引擎的每个sql查询都需要~~ 1-2毫秒
  • 一天最多可容纳30名会员
我们正在尝试制作一份显示简单表格的报告:

名字|姓氏|测量1。。。措施10|

mondrian完成的所有SQL查询都需要12毫秒,因此不相关

由saiku生成的MDX如下所示:

WITH
SET [~FILTER] AS
    {[Period].[Date Only].[2020-09-01], [Period].[Date Only].[2020-09-02]}
SET [~ROWS_Members_First name] AS
    {[Members].[First name].[First name].Members}
SET [~ROWS_Members_Last name] AS
    {[Members].[Last name].[Last name].Members}
SELECT
NON EMPTY {[Measures].[Measure1], ... [Measures].[Measure10]} ON COLUMNS,
NON EMPTY NonEmptyCrossJoin([~ROWS_Members_First name], [~ROWS_Members_Last name]) ON ROWS
FROM [Member]
WHERE [~FILTER]
那么你问的问题在哪里? 问题在于性能。。。这些是生成结果的时间,具体取决于时间过滤器:

1 day -> 0.6 sec (nice !)
2 days -> 32 sec
3 days -> 90 sec
...
7 days -> 600 sec
正如你所看到的,这看起来很可怕。每天最多有30个成员,因此sql查询非常小。 我真的不喜欢日志中的一件事是,我可以看到每个sql都包含所有可用的成员,而不是只依赖于在选定的时间范围内可用的成员

有人知道这里发生了什么吗?非常感谢您的帮助

更新1:

有趣的是,当我添加任何类型的度量值过滤器(如[measure 1]>0)时,查询返回的速度甚至快20-30倍!由于这只是一个虚拟过滤器,它总是正确的。。。结果是一样的。 当涉及到sql查询时,唯一改变的事情是在查询值之前根据使用的过滤器对维度进行相应的过滤。。。因此,只使用已筛选事实成员中存在的维度值