MDX查询优化--插入SQL表

MDX查询优化--插入SQL表,mdx,cube,Mdx,Cube,全部, 我对MDX查询不是很熟悉,如果您熟悉的话,那么这个问题很快就会让您明白。此查询是根据我复制的tableau MDX查询修改的。我将查询与链接的SSMS服务器一起使用,并插入到表中。这是必要的,因为我可以检索数据。结果数据集包含许多重复的/空的列/行,通常会导致锁定冲突。这个查询可以改进吗?我知道这不是获取数据的理想方式,但这是我所能做的 set @SQL = 'SELECT * INTO db_rpt.dbo.temptable1 from (select * from openque

全部,

我对MDX查询不是很熟悉,如果您熟悉的话,那么这个问题很快就会让您明白。此查询是根据我复制的tableau MDX查询修改的。我将查询与链接的SSMS服务器一起使用,并插入到表中。这是必要的,因为我可以检索数据。结果数据集包含许多重复的/空的列/行,通常会导致锁定冲突。这个查询可以改进吗?我知道这不是获取数据的理想方式,但这是我所能做的

set @SQL = 'SELECT * INTO db_rpt.dbo.temptable1 from (select * from 
openquery(server,''
WITH MEMBER [Measures].[LEVEL INSTANCE none:Date:qk - lev00] 
AS ''''CASE WHEN IsEmpty([Dim Date].[Date].CurrentMember.MemberValue) OR [Dim Date].[Date].CurrentMember.MemberValue = null 
THEN null 
ELSE CDate([Dim Date].[Date].CurrentMember.MemberValue) 
END''''
,SOLVE_ORDER = 127

SELECT 
{[Measures].[METRIC1]
,[Measures].[METRIC2]
,[Measures].[METRIC3]
,[Measures].[METRIC4]
,[Measures].[METRIC5]
,[Measures].[METRIC6]
} 

DIMENSION PROPERTIES HIERARCHY_UNIQUE_NAME ON COLUMNS , 
NON EMPTY (Hierarchize({DrilldownLevel({[Dim Employee].[GROUP1].[All]},,,INCLUDE_CALC_MEMBERS)})
,Hierarchize({DrilldownLevel({[Dim Employee].[Unique Emp Name].[All]},,,INCLUDE_CALC_MEMBERS)})
,Hierarchize({DrilldownLevel({[Dim Employee].[GROUP2].[All]},,,INCLUDE_CALC_MEMBERS)})
,Hierarchize({DrilldownLevel({[Dim Employee].[GROUP3].[All]},,,INCLUDE_CALC_MEMBERS)})
,Hierarchize({DrilldownLevel({[Dim Employee].[GROUP4].[All]},,,INCLUDE_CALC_MEMBERS)})
,Hierarchize({DrilldownLevel({[Dim Employee].[GROUP5].[All]},,,INCLUDE_CALC_MEMBERS)}))    ON ROWS 

 FROM [Cube] 
 WHERE (StripCalculatedMembers(Filter(  [Dim Date].[Date].[Date].AllMembers
 ,(([Measures].[LEVEL INSTANCE none:Date:qk - lev00] >= cdate(''''' + @date1 + ''''')) 
 AND ([Measures].[LEVEL INSTANCE none:Date:qk - lev00] <= cdate(''''' + @date2 + ''''')))))
 ,[Dim QA Form Section].[System - Form].[Form].&[Group]&[Form1])'')) t1' 
案例可能比IIF慢,因此可能需要重新编写:

CASE WHEN IsEmpty([Dim Date].[Date].CurrentMember.MemberValue) OR [Dim Date].[Date].CurrentMember.MemberValue = null 
THEN null 
ELSE CDate([Dim Date].[Date].CurrentMember.MemberValue) 
END
我认为这相当于:

IIF(
  IsEmpty([Dim Date].[Date].CurrentMember.MemberValue) 
  OR [Dim Date].[Date].CurrentMember.MemberValue = null 
 ,NULL
 ,CDate([Dim Date].[Date].CurrentMember.MemberValue) 
)
可以进一步简化为:

IIF(
  IsEmpty([Dim Date].[Date].CurrentMember) 
 ,NULL
 ,CDate([Dim Date].[Date].CurrentMember.MemberValue) 
)
诊断的

如果替换此块:

WHERE (StripCalculatedMembers(Filter(  [Dim Date].[Date].[Date].AllMembers
 ,(([Measures].[LEVEL INSTANCE none:Date:qk - lev00] >= cdate(''''' + @date1 + ''''')) 
 AND ([Measures].[LEVEL INSTANCE none:Date:qk - lev00] <= cdate(''''' + @date2 + ''''')))))
 ,[Dim QA Form Section].[System - Form].[Form].&[Group]&[Form1])

它现在跑得快吗?Filter是一个应该节约使用的函数,所以我只是想尝试上面的方法看看是否是问题?

由于锁定问题,我们不再使用openquery,现在使用此项目提供的CLR存储过程@whytheq谢谢!,我可以用它来选择SQL表吗?我们用它来插入临时表,例如插入BLAHBLAH;EXEC ExecuteOLAP@Server、@Database、@MDX;非常感谢你的帮助。现状。。。由于锁定冲突造成的中断,访问被吊销。。。问这个问题有点晚了。也许这将有助于恢复我的访问权限,以便我可以恢复我的项目!再次感谢。
WHERE ([Dim QA Form Section].[System - Form].[Form].&[Group]&[Form1])