2017-03-20 8 views
0

Wir haben dynamische Sicherheit in unserem SSAS-Cube implementiert. Wir verwenden SQL Server 2012Langsame dynamische Sicherheit in SSAS

Es gibt Mitarbeiter Dimension mit der folgenden Hierarchie (nicht Eltern-Kind)

Region 
    Corporation 
    Department 
     Team 
     Employee 

wir eine Brücke Tisch haben, mit der Maßnahme [User Mitarbeiterzugriffs Count] definiert zwischen unseren Benutzertabelle und die Employee-Tabelle.

In der Cube-Dimension Employee haben wir in der Team-Hierarchie die folgende MDX für die erlaubte Menge.

Dies ist, was ich gefunden habe, um die Standardmethode der dynamischen Sicherheit zu implementieren, und es funktioniert.

Das Problem besteht darin, dass eine lange Latenzzeit besteht, wenn ein Benutzer zum ersten Mal auf den Cube zugreift. Es gibt ungefähr 40.000 Mitglieder der Dimension "Mitarbeiter", und das MDX dauert etwa 2-3 Sekunden, wenn ich es in einer Abfrage verwende, aber wenn ein Benutzer zum ersten Mal int meldet, wenn er Zugriff auf die meisten oder alle Mitarbeiter hat Die Abfrage bleibt bis zu 90 Sekunden hängen, bevor sie beendet wird.

Die Abfrage ist nicht wichtig und nachfolgende Abfragen haben keinen Leistungseinbruch.

Meine Vermutung ist, dass SSAS die Zeit nutzt, um die interne Sicherheitsstruktur aufzubauen. Wie ich sagte Qhen definiere ich das oben genannte MDX als eine Menge in einer MDX - Abfrage und führen Sie es in SSMS, dauert es 2-3 Sekunden, um alle Zeilen zurückzugeben, auch wenn der Benutzer Zugriff auf 40.000 Dimension Mitglieder hat, und das schließt die Overhead von SSMS, um alle Zeilen auszudrucken.

Ich habe versucht, eine Kombination von Sicherheitseinstellungen zu machen. Die meisten Benutzer haben nur Zugang zu einem kleinen Teil der Mitarbeiter und haben eine Latenz von weniger als 30 Sekunden. Das ist langsam, aber akzeptabel. Deshalb haben wir versucht, eine Gruppe für Benutzer mit Zugriff auf viele Mitarbeiter zu erstellen Mitglied festgelegt, aber die Verwaltung ist umständlich, und wir erleben immer noch hohe Latenz bei der ersten Anmeldung.

Derzeit habe ich einen Job eingerichtet, der die Benutzer mit der höchsten Latenz und die häufigsten Benutzer durchläuft und alle 30 Minuten eine einfache MDX-Abfrage für den Cube durchführt. Dies erwärmt die dynamische Sicherheit und minimiert die Auswirkungen auf den Benutzer, aber gelegentlich müssen sie immer noch auf die erste Anmeldung warten, und idealerweise möchte ich die erste Abfrage-Latenz abschaffen.

Hat jemand Erfahrung mit dynamischer Sicherheit in Umgebungen mit großen Dimensionen und einer großen Anzahl von Berichtsbenutzern?

+0

Übrigens - die "customdata()" ist vorhanden, weil Benutzer manchmal auf den Cube über eine benutzerdefinierte Komponente zugreifen, die sich als Dienstbenutzer anmeldet, aber den Benutzernamen als benutzerdefinierte Daten enthält. –

+0

Wenn ich verstehe, begrenzen Sie, welche Teams Benutzer sehen können. Ist es akzeptabel, dass ein Benutzer mit Berechtigungen für Team 1 und Abteilung 1 die Abteilungssummen für Abteilung 2, aber keine Gesamtsummen für Teams für andere Teams anzeigt? Wenn sie sich die Summe für Abteilung 1 ansehen, sollte sie nur das Team 1 insgesamt oder die Summe aller Teams in Abteilung 1 zeigen?Ich frage, weil ich vermute, dass das Deaktivieren des Feldes "Visual Totals" auf der Dimensionsdatensicherheitsregisterkarte in der Rolle möglicherweise die Leistung verbessert. Es ist einen Versuch wert, wenn dies Ihren Anforderungen entspricht. – GregGalloway

Antwort

1

NonEmpty() ist eine Berechnung, die kostet, wenn es um riesige Dimensionen geht und man jedes Mal laufen muss, was nicht gut ist. Was ist mit der Speicherung von Sets in Ihrer Dimensionstabelle? Wie:

|=======================================================| 
|UserID | UserName | EmployeesSet      | 
|=======================================================| 
| 1  | Adam B | {[Employees].[Employees].&[Adamb]} | 
|=======================================================| 

Dann können Sie es als Schlüsselwert importieren und analysieren es mit StrToSet() anstelle der laufenden NonEmpty() Funktion.