Χρήση της συνάρτησης IndexCol

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

Πληροφορίες για τη συνάρτηση IndexCol

Χρησιμοποιείτε τη συνάρτηση IndexCol όταν οι στήλες ή οι τιμές σε έναν υπολογισμό διαφέρουν ανάλογα με την τιμή μιας μεταβλητής περιόδου λειτουργίας, χώρου αποθήκευσης ή παρουσίασης.

Η σύνταξη της συνάρτησης IndexCol είναι:

INDEXCOL(<<integer_literal>>, <<expr_list>>)

Όπου το πρώτο όρισμα αναλύεται σε ακέραιο αριθμό και τα στοιχεία που αποτελούν το <<expr_list>> αντιστοιχούν στον αριθμό των πιθανών τιμών του πρώτου ορίσματος. Ένα από αυτά τα στοιχεία στη συνέχεια χρησιμοποιείται στη δήλωση SQL με βάση την τιμή του πρώτου ορίσματος.

Για παράδειγμα, αν το όρισμα <<integer_literal>> έχει τρεις πιθανές τιμές, τότε πρέπει να υπάρχουν τρία ορίσματα στο όρισμα <<expr_list>> , ένα για κάθε πιθανή τιμή του <<integer_literal>>.

Το πρώτο όρισμα συχνά βασίζεται στην τιμή μιας μεταβλητής περιόδου λειτουργίας ή μιας δήλωσης CASE αναφορικά με μεταβλητές. Μπορείτε να μοντελοποιήσετε τη συνάρτηση IndexCol στο αρχείο χώρου αποθήκευσης (RPD) ή απευθείας σε μια στήλη αναφοράς. Μπορείτε να δημιουργήσετε πολλές ένθετες συναρτήσεις IndexCol για να σχηματίσετε μια μεμονωμένη δήλωση.

Πλεονεκτήματα της συνάρτησης IndexCol

Ένας υπολογισμός που χρησιμοποιεί μια δήλωση <<case when>> προωθείται ολόκληρος στον κώδικα φυσικής SQL. Συγκριτικά, η συνάρτηση IndexCol προωθεί προς τα κάτω μόνο την απαιτούμενη στήλη ή έκφραση στη βάση δεδομένων. Αυτό οφείλεται στο γεγονός ότι η συνάρτηση IndexCol αξιολογείται πριν δημιουργηθεί ο κώδικας φυσικής SQL.

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

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

Παράδειγμα

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

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

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

CASE

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'USD' THEN "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd" 

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'EUR' THEN  "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur" 

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'AUD' THEN  "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud" 

ELSE NULL

END

Ο δεύτερος χρησιμοποιεί τη συνάρτηση IndexCol, ως εξής:

INDEXCOL(

CASE VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY")

WHEN 'USD' THEN 0

WHEN 'EUR' THEN 1

WHEN 'AUD' THEN 2

END ,

"01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud")

Επειδή το πρώτο όρισμα της συνάρτησης IndexCol πρέπει να αναλυθεί σε ακέραιο, χρησιμοποιείται μια δήλωση CASE για την ανάλυση.

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

WITH

SAWITH0 AS (select sum(case  when 'USD' = 'USD' then T42437.Revenue_Usd when 'EUR' = 'USD' then T42437.Revenue_Eur when 'AUD' = 'USD' then T42437.Revenue_Aud else NULL end ) as c1,

     T42412.Office_Dsc as c2,

     T42412.Office_Key as c3

from

     BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ ,

     BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */

where  ( T42412.Office_Key = T42437.Office_Key )

group by T42412.Office_Dsc, T42412.Office_Key),

SAWITH1 AS (select 0 as c1,

     D1.c2 as c2,

     D1.c1 as c3,

     D1.c3 as c4

from

     SAWITH0 D1)

select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1,

     D1.c2 as c2,

     D1.c3 as c3

from

     SAWITH1 D1

order by c2 ) D1

The same query run using the IndexCol function pushes down only the expression needed to satisfy the query, because the IndexCol function is resolved prior to SQL generation.  This helps avoid issues with the Optimizer.

WITH

SAWITH0 AS (select sum(T42437.Revenue_Usd) as c1,

     T42412.Office_Dsc as c2,

     T42412.Office_Key as c3

from

     BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ ,

     BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */

where  ( T42412.Office_Key = T42437.Office_Key )

group by T42412.Office_Dsc, T42412.Office_Key),

SAWITH1 AS (select 0 as c1,

     D1.c2 as c2,

     D1.c1 as c3,

     D1.c3 as c4

from

     SAWITH0 D1)

select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1,

     D1.c2 as c2,

     D1.c3 as c3

from

     SAWITH1 D1

order by c2 ) D1

Βιβλία εργασίας και IndexCol

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση IndexCol σε βιβλία εργασίας.

Σε αυτό το παράδειγμα, η συνάρτηση IndexCol χρησιμοποιείται για να αλλάξετε τον βαθμό λεπτομερειών περιόδου σε μια απεικόνιση:

  1. Δημιουργήστε μια παράμετρο που θα χρησιμοποιηθεί ως επιλογέας στήλης για την επιλογή της λεπτομέρειας περιόδου, σε αυτήν την περίπτωση, είτε τον Μήνα είτε το Τρίμηνο.

    Ακολουθεί η περιγραφή για GUID-1141C5E4-DB56-49D1-94EB-3010D274C477-default.jpg
    .jpg''

  2. Δημιουργήστε έναν προσαρμοσμένο υπολογισμό για να εκτελέσετε τη συνάρτηση IndexCol. Σε αυτή την περίπτωση ο υπολογισμός είναι:
    indexcol(case when @parameter("Time Selector Value")('Month')='Month' then 0 else 1 end, "HCM - Workforce Core"."Time"."Month Name", "HCM - Workforce Core"."Time"."Quarter")

    Ακολουθεί η περιγραφή για GUID-1EBB2C95-3D23-48C6-9754-EF968AFAFE98-default.jpg
    .jpg''

  3. Προσθέστε την παράμετρο στη γραμμή φίλτρων ενός βιβλίου εργασίας. Οι χρήστες μπορούν στη συνέχεια να αλλάξουν τον βαθμό λεπτομέρειας μιας αναφοράς επιλέγοντας είτε Μήνας ή Τρίμηνο από το φίλτρο επιλογέα στήλης.

    Ακολουθεί η περιγραφή για GUID-C1469E54-1C7D-4FDF-B3E6-CCFE73BF2A32-default.jpg
    .jpg''