2017-07-13 1 views
1

Alle,MDX-Abfrage-Optimierung - Legen Sie in SQL Tabelle

ich mit MDX-Abfragen nicht sehr vertraut bin, wenn Sie sind, die schnell offensichtlich mit dieser Frage werden lassen. Diese Abfrage wurde von einer Tableau-MDX-Abfrage modifiziert, die ich kopiert habe. Ich verwende die Abfrage mit einem verknüpften SSMS-Server, der in eine Tabelle eingefügt wird. Dies ist notwendig, weil ich die Daten abrufen kann. Das resultierende Dataset enthält viele Duplikat/Null-Spalten/Zeilen und führt häufig zu Sperrkonflikten. Kann diese Abfrage verbessert werden? Ich weiß, dass es keine ideale Möglichkeit ist, die Daten zu ziehen, aber es ist alles, was ich tun kann.

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' 
+0

Wir sind von OpenQuery aufgrund von Sperrproblemen weggezogen und verwenden nun die gespeicherten CLR-Prozeduren https://olapextensions.codeplex.com/ – whytheq

+0

@whytheq Thanks !, kann ich dies zur Auswahl in eine SQL-Tabelle verwenden? – yeahthisisrob

+0

verwenden wir es zum Einfügen in temporäre Tabellen, z. 'INSERT IN # BLAHBLAH; EXEC ExecuteOLAP @Server, @Database, @ MDX; ' – whytheq

Antwort

1

CASE kann als IIF langsamer sein, so könnte dies vielleicht werden neu geschrieben:

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 

Ich denke, dies entspricht:

IIF(
    IsEmpty([Dim Date].[Date].CurrentMember.MemberValue) 
    OR [Dim Date].[Date].CurrentMember.MemberValue = null 
,NULL 
,CDate([Dim Date].[Date].CurrentMember.MemberValue) 
) 

Es kann wohl dazu weiter vereinfacht werden :

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

Diagnose

Wenn Sie diesen Block ersetzen:

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]) 

mit diesem:

WHERE ([Dim QA Form Section].[System - Form].[Form].&[Group]&[Form1]) 

Läuft es jetzt schneller? Filter ist eine Funktion, die sparsam verwendet werden sollte, ich denke nur, es wäre sinnvoll, das oben genannte zu versuchen, um zu sehen, ob es das Problem ist?

+0

Vielen Dank für Ihre Hilfe. Aktuelle Situation ... Zugriff aufgrund der durch die Sperrkonflikte verursachten Störungen widerrufen ... diese Frage etwas zu spät gestellt. Vielleicht wird dies helfen, meinen Zugang wiederherzustellen, damit ich meine Projekte fortsetzen kann! Danke noch einmal. – yeahthisisrob

Verwandte Themen