Butuh bantuan untuk mengoptimalkan perhitungan ringkasan DAX multi level

Saya mencari saran tentang cara mengoptimalkan kueri ringkasan DAX multi-level. Yang ini sangat lambat karena, menurut saya, berjalan O(n^3) karena bersarang. Sayangnya, saya perlu memiliki beberapa level karena level hierarki Order > Order Line > Order Detail perlu dihitung secara berbeda.

  • Unit perlu diringkas hingga tingkat Detail
  • Itu perlu dirata-ratakan hingga tingkat Garis
  • Itu perlu diringkas ke tingkat Pesanan

    SUMX(
        SUMMARIZE(
             'FACT Opportunity'
            ,Opportunity[LineId]
            ,"Units"
            ,AVERAGEX(
                SUMMARIZE(
                    'FACT Opportunity'
                    ,Opportunity[DetailId]
                    ,"SumDetail"
                    ,SUM('FACT Opportunity'[Units])
                    )
                ,[SumDetail]
                )
        )
        ,[Units]
    )
    

    Bantuan atau saran apa pun yang dapat Anda berikan akan sangat dihargai.


person Stephen Re    schedule 12.10.2018    source sumber


Jawaban (1)


Sangat sulit untuk memberikan saran pengoptimalan tanpa melihat data dan model data (akan lebih bagus jika disertakan dalam pertanyaan).

Masalah utama di sini adalah kehadiran duplikat membuat fakta "Unit" menjadi non-aditif, artinya Anda tidak bisa begitu saja menggabungkannya dalam hierarki. Akibatnya, Anda terpaksa melakukan triple-looping yang sangat mahal.

Solusi yang jelas adalah menjadikan "Unit" sepenuhnya aditif. Anda dapat menghitung Unit yang tidak diduplikasi (disesuaikan untuk duplikat) dan menyimpannya dalam Peluang, sebagai kolom terhitung:

Adjusted  Units =
DIVIDE (
    'FACT Opportunity'[Units],
    CALCULATE ( COUNT ( 'FACT Opportunity'[DetailId] ) )
)

Di sini, Anda membagi Unit dengan jumlah DetailID unik (biasanya 1, tetapi jika DetailID duplikat menjadi 2, dst).

Kolom terhitung ini akan sedikit menambah waktu pemuatan data Anda, namun menghemat banyak waktu kueri. Untuk mengoptimalkan lebih lanjut, pertimbangkan untuk melakukan perhitungan awal di gudang data.

Unit yang disesuaikan sepenuhnya bersifat aditif, jadi dax Anda sekarang menjadi sederhana:

Total Units = SUM('FACT Opportunity'[Adjusted Units])

Ini harus berfungsi dengan benar pada tingkat mana pun dari hierarki Pesanan > Garis > Detail (kecuali ada masalah tambahan yang tidak dijelaskan dalam pertanyaan), dan harus cepat.

person RADO    schedule 12.10.2018