Табличен модел Много 2 Много

Може ли някой да ми обясни какво точно се случва зад кулисите със следните две запитвания? те изглежда показват едни и същи резултати, но кое е "по-добро" за филтриране на мярка в табличен модел dax през връзка много към много...

Ето (доста стандартния) модел: FactData ---> Account ‹--- AccountCustomerM2M ---> Customer

Пример 1:

SumAmountM2M - v1 :=
IF (
    COUNTROWS ( ALL ( Customers ) ) > 0,
    CALCULATE ( SUM ( 'FactData'[Amount] ), AccountCustomerM2M ),
    SUM ( 'FactData'[Amount] )
)

Пример 2:

SumAmountM2M - v2 :=
IF (
    ISCROSSFILTERED ( 'Customers'[CustomerKey] ),
    CALCULATE ( SUM ( 'FactData'[Amount] ), AccountCustomerM2M ),
    SUM ( 'FactData'[Amount] )
)

Благодаря за вашата помощ! :)


person m1nkeh    schedule 04.11.2014    source източник


Отговори (1)


Пример 1 винаги използва изчислението много към много, независимо от избора на Клиенти, освен ако таблицата Клиенти не е празна. Може би сте искали да напишете IF ( COUNTROWS ( ВСИЧКИ ( Клиенти ) ) > COUNTROWS ( Клиенти ), ...

Пример 2 изпълнява изчислението много към много само независимо дали имате пряк или непряк избор на клиенти (напр. избрали сте града на клиента в слайсер)

Пример 2 оптимизира изчислението, тъй като функцията ISCROSSFILTERED се изпълнява само веднъж в плана на заявката и е по-оптимизирана от подхода COUNTROWS, който при сложна итерация може да бъде по-скъп, защото се изпълнява във всеки контекст на ред на външна итерация.

Марко

person Marco Russo    schedule 04.11.2014
comment
разбира се, че е, о! ;) благодаря за отговора, Марко, причината да възникне този въпрос е, че в друга част от моя модел имам FactData --› DimCustomer ‹-- DimCustomerSecure и ако заключа таблицата DimCustomerSecure с =FALSE(), трябва да обвия много мерки със секцията COUNTROWS(ALL(DimCustomerSecure)), за да може филтрирането да работи правилно или по-скоро игнорирайте филтрирането! надявам се екипът на AS да направи таблици и колони защитени обекти в някоя бъдеща версия на AS. - person m1nkeh; 06.11.2014