Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Enhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.

Reply
Syndicate_Admin
Administrator
Administrator

Esta columna calculada hace que todo sea lento

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

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

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:

some1else_0-1671708644829.png

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:

https://www.dropbox.com/s/k9a7ikcxfnwswhl/Sample.xlsx?dl=0

Helpful resources

Announcements
July 2025 community update carousel

Fabric Community Update - July 2025

Find out what's new and trending in the Fabric community.

July PBI25 Carousel

Power BI Monthly Update - July 2025

Check out the July 2025 Power BI update to learn about new features.

Top Solution Authors
Top Kudoed Authors