The ultimate Fabric, Power BI, SQL, and AI community-led learning event. Save €200 with code FABCOMM.
Get registeredEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
He seguido esta publicación de blog para hacer una columna calculada propia, aplicada a una tabla de 3 millones de filas.
https://community.powerbi.com/t5/Community-Blog/Mean-Time-Between-Failure-MTBF-and-Power-BI/ba-p/339...
Después de esto, abrir el archivo PBIX, crear medidas o columnas es lento. La ventana emergente "Trabajando en ello" tarda unos minutos en desaparecer.
¿Alguna solución para mejorar el rendimiento en esto?
Gracias
Creo que lo que está sucediendo es que cada vez que editas el modelo, se está recalculando la columna calculada, que no se escribió de manera especialmente eficiente. Definir esto como una medida sin usar columnas calculadas debería ayudar y @Greg_Deckler tiene otra publicación sobre eso aquí:
https://community.powerbi.com/t5/Quick-Measures-Gallery/Mean-Time-Between-Failure-MTBF/m-p/625082
Tenga en cuenta que la medida de Greg tendrá problemas de rendimiento similares (en comparación con la columna calculada), pero usarla en lugar de una columna calculada evitará que tenga que volver a calcularla cada vez que edite su modelo.
Usando la nueva función OFFSET, aquí hay una versión que es aproximadamente 30 veces más rápida (~ 6 ms vs ~ 180 ms) de acuerdo con mis pruebas contra el pbix adjunto a la publicación que vinculé. Debería ser mucho mejor para modelos grandes, así como más dinámicamente adaptable a varios filtros (además de que solo necesita calcular sobre todos los datos seleccionados en lugar de toda la tabla de hechos).
MTBF (Hours) AO =
VAR _Summary_ =
CALCULATETABLE (
SUMMARIZE (
Repairs,
Repairs[MachineName],
Repairs[RepairStarted],
Repairs[RepairCompleted]
),
KEEPFILTERS ( Repairs[RepairType] <> "PM" )
)
VAR _AddNext_ =
ADDCOLUMNS (
_Summary_,
"@NextRepair",
SELECTCOLUMNS (
OFFSET (
1,
_Summary_,
ORDERBY ( Repairs[RepairStarted] ),
PARTITIONBY ( Repairs[MachineName] )
),
"RepairStarted", [RepairStarted]
)
)
VAR _Uptime_ =
ADDCOLUMNS (
_AddNext_,
"@Uptime",
DATEDIFF (
[RepairCompleted],
COALESCE ( [@NextRepair], NOW () ),
SECOND
)
)
RETURN
AVERAGEX ( _Uptime_, [@Uptime] ) / 3600
Wow, gracias por la extensa respuesta, lo examinaré esta noche.
Usando la columna calculada y la medida obtengo resultados diferentes:
Incluso la columna calculada tiene algunos valores extraños. Mire las filas 5 y 6, el MTBF debe ser 0, no 2283 horas, que es el MTBF entre la fila 7 y 6. ¿Alguna idea?
@some1else Va a ser extremadamente difícil solucionar esto sin algunos datos de muestra como texto y su fórmula de medida.
Datos de ejemplo al final. Quiero ver solo un código específico "A1".
Si nos fijamos en la muestra, por el método de medición solamente, todos los cálculos son incorrectos. Por la forma de columna calculada, Machine1 parece tener el MTBF adecuado, pero Machine2 está muy lejos ...
La columna calculada tiene este código:
Uptime =
VAR next =
MINX (
FILTER (
'TABLE',
'TABLE'[Machine] = EARLIER ( 'TABLE'[Machine] )
&& 'TABLE'[actstart] > EARLIER ( 'TABLE'[actstart] )
&& 'TABLE'[failurecode] = "A1"
),
'TABLE'[actstart]
)
RETURN
IF (
'TABLE'[failurecode] <> "A1",
0,
IF (
ISBLANK ( next ),
DATEDIFF ( 'TABLE'[actfinish], NOW (), SECOND ),
DATEDIFF ( 'TABLE'[actfinish], next, SECOND )
)
)
La medida tiene este código:
MTBF (Hours) = DIVIDE(SUM('TABLE'[Uptime]),[Repairs],BLANK())/3600
Por el método Measure only, este es el código:
MTBF (Hours) Measure =
VAR __table = 'TABLE'
VAR __table1 =
ADDCOLUMNS(__table,"__next",
MINX(
FILTER(__table,
'TABLE'[Localização]=EARLIER('TABLE'[Machine]) &&
'TABLE'[Localização] = EARLIER ( 'TABLE'[Machine] ) &&
'TABLE'[failurecode]="A1"
),
'TABLE'[actstart]
)
)
VAR __table2 = ADDCOLUMNS(__table1,"__uptime",
IF('TABLE'[failurecode]<>"A1",
0,
IF(ISBLANK([__next]),
DATEDIFF('TABLE'[actfinish],NOW(),SECOND),
DATEDIFF('TABLE'[actfinish],[__next],SECOND)
)
)
)
VAR __repairs = CALCULATE(COUNTROWS('TABLE'),FILTER(ALLSELECTED('TABLE'),'TABLE'[failurecode]="A1"))
RETURN
DIVIDE(SUMX(__table2,[__uptime]),__repairs,BLANK())/3600
Muestra: