Ρύθμιση απόδοσης ερωτημάτων πολυδιάστατης βάσης δεδομένων

Όταν χρησιμοποιείτε μια πολυδιάστατη βάση δεδομένων ως πηγή δεδομένων στο Oracle Analytics, μπορεί να αντιμετωπίσετε ζητήματα απόδοσης που οδηγούν στη δημιουργία ερωτημάτων πολυδιάστατων εκφράσεων (MDX) τα οποία δεν είναι τα βέλτιστα.

Με την τροποποίηση της σχεδίασης, μπορείτε να βελτιώσετε τα ερωτήματα MDX που δημιουργεί το Oracle Analytics. Αυτό μπορεί να έχει τεράστια επίδραση, όχι μόνο στην απόδοση των αναφορών σας, αλλά και στον όγκο των πόρων που χρησιμοποιούνται στη βάση δεδομένων. Ο τρόπος που χρησιμοποιείτε τις υποστηριζόμενες ή μη υποστηριζόμενες συναρτήσεις επηρεάζει πολύ σημαντικά τα ερωτήματα MDX που παράγονται και συνεπώς την απόδοση.

Επειδή κάθε περίπτωση είναι μοναδική, η ομάδα προγραμματιστών σας πρέπει να εξετάσει τις επιλογές, να αναλύσει τα αρχεία καταγραφής ερωτημάτων του Oracle Analytics και να επιλέξει τη βέλτιστη λύση για τη δική σας περίπτωση χρήσης.

Αυτό το θέμα δεν καλύπτει ζητήματα απόδοσης που προκλήθηκαν από την υποδομή σας, όπως τα δίκτυα, τα προγράμματα περιήγησης ή την παρουσίαση αναφορών.

Μεθοδολογία

Η Oracle συνιστά να ολοκληρώσετε τις παρακάτω εργασίες για να αυξήσετε την απόδοση. Είναι σημαντικό να κατανοήσετε τη δομή των ερωτημάτων MDX καθώς και τα αρχεία καταγραφής ερωτημάτων που παράγει το Oracle Analytics.

  • Απλουστεύστε τα ερωτήματα MDX που παράγονται.
  • Μειώστε τον αριθμό των ερωτημάτων MDX που δημιουργούνται.
  • Βεβαιωθείτε ότι εφαρμόζονται τα βέλτιστα φίλτρα και οι επιλογές στο ερώτημα MDX.
  • Ρυθμίστε την απόδοση με τον διαχειριστή βάσης δεδομένων (DBA) στην πολυδιάστατη βάση δεδομένων και επαληθεύστε γιατί η βάση δεδομένων προέλευσης εξακολουθεί να έχει κακή απόδοση.
  • Τροποποιήστε την ανάλυση με βάση την ανατροφοδότηση του διαχειριστή βάσης δεδομένων.

Βελτιστοποίηση βημάτων επιλογής

Όταν βελτιστοποιείτε τα βήματα επιλογής, μπορείτε να απλουστεύσετε τα ερωτήματα MDX, να μειώσετε τον αριθμό των ερωτημάτων MDX που δημιουργούνται και να αυξήσετε την απόδοση.

Το ακόλουθο σχήμα παρουσιάζει ένα παράδειγμα μιας σύγκρισης των βελτιστοποιημένων και μη βελτιστοποιημένων βημάτων επιλογής.

Ακολουθεί η περιγραφή για GUID-43E6F348-B14C-40DC-8C21-DA34DAE44344-default.jpg
.jpg''

Δηλώσεις CASE

Η λειτουργικότητα δηλώσεων CASE δεν υποστηρίζεται στα ερωτήματα MDX και πρέπει να εφαρμόζεται πάντα στο Oracle Analytics. Η λογική που εξηγείται σε αυτήν την ενότητα αναφορικά με τις δηλώσεις CASE ισχύει για τις περισσότερες συναρτήσεις που δεν υποστηρίζονται στα ερωτήματα MDX (if null και ούτω καθεξής).

Υπάρχουν πλεονεκτήματα και μειονεκτήματα όταν χρησιμοποιείτε τις δηλώσεις CASE. Όταν συμπεριλαμβάνετε δηλώσεις CASE σε τύπους αναφοράς, αυτές δεν περιλαμβάνονται στο ερώτημα MDX. Αυτό μπορεί να απλοποιήσει το ερώτημα MDX και να βελτιώσει την απόδοση. Ωστόσο, η αντιστάθμιση είναι ότι δεν μπορείτε να φιλτράρετε εξίσου αποτελεσματικά, πράγμα που σημαίνει ότι το ερώτημα ενδέχεται να επιστρέψει περισσότερες εγγραφές από ό, τι είναι απαραίτητο.

Οι ακόλουθοι είναι περιορισμοί για τη χρήση της λειτουργικότητας δηλώσεων CASE:

  • Αν η δήλωση CASE δεν συνδυάζει πολλά μέλη, η βασική στήλη που χρησιμοποιείται στη δήλωση θα πρέπει να περιλαμβάνεται στο ερώτημα και τις προβολές ως κρυφή ξεχωριστή στήλη.
  • Αν η δήλωση CASE συνδυάζει πολλά μέλη, η βασική στήλη δεν μπορεί να περιλαμβάνεται στην προβολή χωρίς να επηρεάζεται το επίπεδο συνάθροισης. Σε αυτήν την περίπτωση:
    • Εάν ο κανόνας συνάθροισης για τη μέτρηση δεν είναι Εξωτερική συνάθροιση, η βασική στήλη πρέπει να εξαιρεθεί από το ερώτημα.
    • Αν ο κανόνας μέτρησης για τη συνάθροιση είναι Εξωτερική συνάθροιση, η βασική στήλη πρέπει να περιλαμβάνεται στο ερώτημα και να εξαιρείται από την προβολή. Πρέπει να αλλάξετε τον κανόνα μέτρησης για τη συνάθροιση από την προεπιλογή σε έναν απλό κανόνα εσωτερικής συνάθροισης (SUM, MAX, MIN). Αυτό λειτουργεί μόνο αν ο κανόνας εσωτερικής συνάθροισης χρησιμοποιείται για τον συνδυασμό μελών και παρέχει σωστά αποτελέσματα.

Συνάρτηση FILTER

Σε αντίθεση με τη λειτουργικότητα της δήλωσης CASE, η συνάρτηση FILTER μπορεί να σταλεί στη βάση δεδομένων για εκτέλεση.

Το κύριο πλεονέκτημα της χρήσης της συνάρτησης FILTER σε τύπους αναφορών είναι ότι η επιλογή εφαρμόζεται στο ερώτημα MDX και ο όγκος δεδομένων που υπολογίζεται και ανακτάται από τη βάση δεδομένων είναι μειωμένος.

Το κύριο μειονέκτημα της χρήσης της συνάρτησης FILTER είναι ότι μπορεί να αυξήσει τον αριθμό των ερωτημάτων MDX που εκτελούνται. Από προεπιλογή, εκτελείται ένα ερώτημα για κάθε συνάρτηση FILTER που χρησιμοποιείται.

Παράδειγμα CASE έναντι FILTER

Σε αυτό το παράδειγμα, ένας χρήστης ζητά μια αναφορά που δείχνει το κέρδος ανά τρίμηνο και την επιλεγμένη ΜΔΑ προϊόντος. Επιπλέον, οι ΜΔΑ είναι ομαδοποιημένες σε 12 κατηγορίες. Στην κατηγορία "Other Cola" έχουν αντιστοιχιστεί τα ακόλουθα προϊόντα του τομέα επιχείρησης: Cola, Diet Cola και Shared Diet Cola.

Ακολουθεί η περιγραφή για GUID-7198F143-54E6-4A48-9579-96624936A94D-default.jpg
.jpg''

Ορίστε το λογικό ερώτημα δήλωσης CASE:

SELECT

   0 s_0,

   CASE when XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" in ('Cola','Diet Cola','Shared Diet Cola') THEN 'Other Cola' ELSE XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" END s_1,

   DESCRIPTOR_IDOF(XSA('Admin'.'Sample.BasicPM')."Product"."Category") s_2,

   DESCRIPTOR_IDOF(XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU") s_3,

   DESCRIPTOR_IDOF(XSA('Admin'.'Sample.BasicPM')."Year"."Quarter") s_4,

   SORTKEY(XSA('Admin'.'Sample.BasicPM')."Product"."Category") s_5,

   SORTKEY(XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU") s_6,

   SORTKEY(XSA('Admin'.'Sample.BasicPM')."Year"."Quarter") s_7,

   XSA('Admin'.'Sample.BasicPM')."Product"."Category" s_8,

   XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" s_9,

   XSA('Admin'.'Sample.BasicPM')."Year"."Quarter" s_10,

   XSA('Admin'.'Sample.BasicPM')."Basic"."Profit" s_11

FROM XSA('Admin'.'Sample.BasicPM')

ORDER BY 8 ASC NULLS LAST, 11 ASC NULLS LAST, 5 ASC NULLS LAST, 2 ASC NULLS LAST, 7 ASC NULLS LAST, 10 ASC NULLS LAST, 4 ASC NULLS LAST, 6 ASC NULLS LAST, 9 ASC NULLS LAST, 3 ASC NULLS LAST

FETCH FIRST 125001 ROWS ONLY

Δεν υπάρχει ομαδοποίηση με βάση τη δήλωση CASE. Παράγεται ένα απλό ερώτημα MDX, με τη δήλωση CASE να υποβάλλεται σε επεξεργασία από το Oracle Analytics:

With 
  set [_Product3]  as 'Descendants([Product], [Product].Generations(3), leaves)'
  set [_Year2]  as 'Descendants([Year], [Year].Generations(2), leaves)'
select 
  { [Measures].[Profit]
  } on columns,
  NON EMPTY {crossjoin({[_Year2]},{[_Product3]})} properties GEN_NUMBER, [Product].[MEMBER_UNIQUE_NAME], [Product].[Memnor], [Year].[MEMBER_UNIQUE_NAME], [Year].[Memnor] on rows 
from [Sample.Basic]

Η δήλωση CASE εκτελείται στον BI Server και αυτό φαίνεται από τη ρύθμιση βάσης δεδομένων που έχει οριστεί σε database 0:0,0:

 RqList <<11777451>> [for database 0:0,0]
                            D1.c6 as c6 [for database 0:0,0],
                            D1.c4 as c4 [for database 0:0,0],
                            case  when D1.c7 in ([ 'Cola', 'Diet Cola', 'Shared Diet Cola'] ) then 'Other Cola' else D1.c7 end  as c2 [for database 0:0,0],
                            D1.c5 as c5 [for database 0:0,0],
                            D1.c3 as c3 [for database 0:0,0],
                            D1.c1 as c1 [for database 0:0,0],
                            D1.c7 as c7 [for database 0:0,0],
                            D1.c8 as c8 [for database 0:0,0]

Εναλλακτικά, μπορείτε να χρησιμοποιήσετε ένα φίλτρο με βάση το μέτρο κέρδους για να ανακτήσετε μόνο τα απαιτούμενα μέλη του τομέα επιχείρησης. Σε αυτό το σενάριο, δημιουργείτε τρεις δείκτες μέτρησης με εφαρμοσμένα τα αντίστοιχα φίλτρα.

Ορίστε το λογικό ερώτημα δήλωσης FILTER:

SELECT

   0 s_0,

   DESCRIPTOR_IDOF(XSA('Admin'.'Sample.BasicPM')."Product"."Category") s_1,

   DESCRIPTOR_IDOF(XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU") s_2,

   DESCRIPTOR_IDOF(XSA('Admin'.'Sample.BasicPM')."Year"."Quarter") s_3,

   SORTKEY(XSA('Admin'.'Sample.BasicPM')."Product"."Category") s_4,

   SORTKEY(XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU") s_5,

   SORTKEY(XSA('Admin'.'Sample.BasicPM')."Year"."Quarter") s_6,

   XSA('Admin'.'Sample.BasicPM')."Product"."Category" s_7,

   XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" s_8,

   XSA('Admin'.'Sample.BasicPM')."Year"."Quarter" s_9,

   FILTER(XSA('Admin'.'Sample.BasicPM')."Basic"."Profit" USING XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" in ('Cola','Diet Cola','Shared Diet Cola')) s_10,

   FILTER(XSA('Admin'.'Sample.BasicPM')."Basic"."Profit" USING XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" in ('Sasprilla','Birch Beer','Dark Cream')) s_11,

   FILTER(XSA('Admin'.'Sample.BasicPM')."Basic"."Profit" USING XSA('Admin'.'Sample.BasicPM')."Product"."Product SKU" in ('xxxxx')) s_12

FROM XSA('Admin'.'Sample.BasicPM')

ORDER BY 7 ASC NULLS LAST, 10 ASC NULLS LAST, 4 ASC NULLS LAST, 6 ASC NULLS LAST, 9 ASC NULLS LAST, 3 ASC NULLS LAST, 5 ASC NULLS LAST, 8 ASC NULLS LAST, 2 ASC NULLS LAST

FETCH FIRST 125001 ROWS ONLY

Σε αυτό το σενάριο, δημιουργούνται τρία ερωτήματα, ένα για κάθε φίλτρο, και έχετε ζητήματα απόδοσης.

Ερώτημα 1:

With

  set [_Product3]  as 'Filter([Product].Generations(3).members, ((IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "xxxxx")))'

  set [_Year2]  as 'Descendants([Year], [Year].Generations(2), leaves)'

select

  { [Measures].[Profit]

  } on columns,

  NON EMPTY {crossjoin({[_Year2]},{[_Product3]})} properties MEMBER_NAME, GEN_NUMBER, property_expr([Product], [MEMBER_NAME], Ancestor(currentaxismember(), [Product].Generations(2)), "Category_Null_Alias_Replacement"), property_expr([Product], [Default], Ancestor(currentaxismember(), [Product].Generations(2)), "Category"), property_expr([Product], [MEMBER_UNIQUE_NAME], Ancestor(currentaxismember(), [Product].Generations(2)), "Category - Member Key"), property_expr([Product], [Memnor], Ancestor(currentaxismember(), [Product].Generations(2)), "Category - Memnor"), [Product].[MEMBER_UNIQUE_NAME], [Product].[Memnor], [Year].[MEMBER_UNIQUE_NAME], [Year].[Memnor] on rows

from [Sample.Basic]

]]

Ερώτημα 2:

With

  set [_Product3]  as 'Filter([Product].Generations(3).members, ((IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "Birch Beer") OR (IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "Dark Cream") OR (IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "Sasprilla")))'

  set [_Year2]  as 'Descendants([Year], [Year].Generations(2), leaves)'

select

  { [Measures].[Profit]

  } on columns,

  NON EMPTY {crossjoin({[_Year2]},{[_Product3]})} properties MEMBER_NAME, GEN_NUMBER, property_expr([Product], [MEMBER_NAME], Ancestor(currentaxismember(), [Product].Generations(2)), "Category_Null_Alias_Replacement"), property_expr([Product], [Default], Ancestor(currentaxismember(), [Product].Generations(2)), "Category"), property_expr([Product], [MEMBER_UNIQUE_NAME], Ancestor(currentaxismember(), [Product].Generations(2)), "Category - Member Key"), property_expr([Product], [Memnor], Ancestor(currentaxismember(), [Product].Generations(2)), "Category - Memnor"), [Product].[MEMBER_UNIQUE_NAME], [Product].[Memnor], [Year].[MEMBER_UNIQUE_NAME], [Year].[Memnor] on rows

from [Sample.Basic]

]]

Ερώτημα 3:

With

  set [_Product3]  as 'Filter([Product].Generations(3).members, ((IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "Cola") OR (IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "Diet Cola") OR (IIF(IsValid([Product].CurrentMember.MEMBER_ALIAS), [Product].CurrentMember.MEMBER_ALIAS, [Product].CurrentMember.MEMBER_Name) = "Shared Diet Cola")))'

  set [_Year2]  as 'Descendants([Year], [Year].Generations(2), leaves)'

select

  { [Measures].[Profit]

  } on columns,

  NON EMPTY {crossjoin({[_Year2]},{[_Product3]})} properties MEMBER_NAME, GEN_NUMBER, property_expr([Product], [MEMBER_NAME], Ancestor(currentaxismember(), [Product].Generations(2)), "Category_Null_Alias_Replacement"), property_expr([Product], [Default], Ancestor(currentaxismember(), [Product].Generations(2)), "Category"), property_expr([Product], [MEMBER_UNIQUE_NAME], Ancestor(currentaxismember(), [Product].Generations(2)), "Category - Member Key"), property_expr([Product], [Memnor], Ancestor(currentaxismember(), [Product].Generations(2)), "Category - Memnor"), [Product].[MEMBER_UNIQUE_NAME], [Product].[Memnor], [Year].[MEMBER_UNIQUE_NAME], [Year].[Memnor] on rows

from [Sample.Basic]

Παράδειγμα εφαρμογής φίλτρου προϊόντος

Μια καλύτερη προσέγγιση είναι να συμπεριλάβετε τη στήλη προϊόντος στην αναφορά με μια στήλη μοναδικού μέτρου χωρίς φίλτρο. Στη συνέχεια, δημιουργήστε ένα φίλτρο που περιλαμβάνει τα απαιτούμενα προϊόντα. Αν θέλετε να ομαδοποιήσετε τα προϊόντα σε διαφορετικές κατηγορίες, χρησιμοποιήστε μια δήλωση CASE. Σε αυτό το σενάριο, δημιουργείται ένα μεμονωμένο ερώτημα MDX με τις φιλτραρισμένες σειρές και παρόλο που η δήλωση CASE εφαρμόζεται από το Oracle Analytics, χρησιμοποιεί μόνο το υποσύνολο των δεδομένων και όχι όλες τις εγγραφές.

Ακολουθεί ένα άλλο σενάριο στο οποίο οι δηλώσεις CASE προκαλούν ζητήματα απόδοσης.

Ένας προγραμματιστής εφαρμόζει μια δήλωση CASE για να μετονομάσει επωνυμίες. ενώ ένα μήνυμα προτροπής dashboard δίνει τη δυνατότητα στους χρήστες να επιλέξουν την επωνυμία.

Ακολουθεί η περιγραφή για GUID-56356AA9-2AF6-4A67-8ADD-FC4F7F70306C-default.jpg
.jpg''

Ακολουθεί η περιγραφή για GUID-E63719C8-9936-412B-8228-F20E8F048C46-default.jpg
.jpg''

Επειδή η δήλωση CASE δεν υποστηρίζεται στην MDX, το φίλτρο στο Brand2 δεν μπορεί να εφαρμοστεί στο ερώτημα MDX. Επιλέγονται όλες οι επωνυμίες και αυτό δεν είναι ένα βελτιστοποιημένο αποτέλεσμα.

Ακολουθεί η περιγραφή για GUID-6BE1F274-8257-4E31-8D42-406357A07B2A-default.jpg
.jpg''

Σε αυτόν τον τύπο σεναρίου, η Oracle συνιστά να καταργήσετε τη δήλωση CASE και να μετονομάσετε τα μέλη στη βάση δεδομένων ή να δημιουργήσετε ψευδώνυμα.