Las relaciones de muchos a muchos deberían ser unidireccionales
Descripción general
Esta regla de prácticas recomendadas identifica relaciones de muchos a muchos que usan filtrado cruzado bidireccional. Las relaciones de muchos a muchos con filtrado en ambas direcciones provocan una degradación significativa del rendimiento.
- Categoría: Rendimiento
- Gravedad: Media (2)
Se aplica a
- Relaciones
Por qué es importante
- Impacto grave en el rendimiento: el motor debe evaluar los filtros en ambas direcciones
- Consumo de memoria: se mantienen contextos de filtro adicionales
- Rutas de filtro ambiguas: varias rutas producen resultados inesperados
- Lógica DAX compleja: depurar el contexto de filtro se vuelve difícil
- Riesgo de dependencias circulares: puede provocar bucles de evaluación infinitos
Cuándo se activa esta regla
La regla se activa cuando una relación cumple todas estas condiciones:
FromCardinality = "Many"ToCardinality = "Many"CrossFilteringBehavior = "BothDirections"
Cómo solucionarlo
Corrección manual
- En el Explorador TOM, localiza la relación marcada
- En el panel de Propiedades, busca
Dirección de filtro cruzado - Cambia de Ambos a Único
Elige la dirección según el flujo típico del filtro:
- De la dimensión a la tabla de hechos
- De la tabla de búsqueda a la tabla de datos
Cuando necesites filtrar en sentido contrario, manéjalo explícitamente en las medidas:
SalesWithCrossFilter =
CALCULATE(
SUM('Sales'[Amount]),
CROSSFILTER('BridgeTable'[Key], 'DimensionTable'[Key], Both)
)
Causas habituales
Causa 1: Configuración predeterminada en ambas direcciones
El diseñador de modelos aplicó el filtrado bidireccional de forma predeterminada.
Causa 2: Requisitos mal entendidos
Se creía que el filtrado en ambas direcciones era necesario para todos los escenarios.
Causa 3: Enfoque de corrección rápida
Se usó el filtrado en ambas direcciones para resolver un problema concreto sin considerar el rendimiento.
Ejemplo
Antes de la corrección
'Sales' (Muchos) <--> (Muchos) 'ProductBridge'
Dirección de filtro cruzado: Ambos ← Problema
Después de la corrección
'Sales' (Muchos) --> (Muchos) 'ProductBridge'
Dirección de filtro cruzado: Único
Si 'Products' debe filtrar 'Sales', usa DAX:
SalesForSelectedProducts =
VAR SelectedProducts = VALUES('Products'[ProductKey])
RETURN
CALCULATE(
SUM('Sales'[Amount]),
TREATAS(SelectedProducts, 'ProductBridge'[ProductKey])
)
Nivel de compatibilidad
Esta regla se aplica a modelos con nivel de compatibilidad 1200 o superior.
Reglas relacionadas
- Los tipos de datos de la relación deben coincidir - Garantizar la integridad de la relación