Unir múltiples tablas a la izquierda en SQL como nuevas columnas para obtener un mejor rendimiento.
Tengo 3 tablas:
cuenta
id | nombre |
---|---|
1 | |
2 | Apple |
campo_personalizado
id | nombre |
---|---|
1 | Teléfono |
2 | Correo electrónico |
envío_campo_personalizado
id | id_campo_personalizado | id_entidad | valor |
---|---|---|---|
1 | 1 | 1 | 555-444-333 |
2 | 1 | 2 | 111-111-111 |
3 | 2 | 1 | google@goog.com |
4 | 2 | 2 | apple@apple.com |
Resultado esperado después de la consulta
id | nombre | Teléfono | Correo electrónico |
---|---|---|---|
1 | 555-444-333 | google@goog.com | |
2 | Apple | 111-111-111 | apple@apple.com |
Tengo una consulta como esta:
lang-sql
SELECT
a.id,
a.nombre,
telefono.valor as telefono,
correo.valor as correo
FROM cuenta a
LEFT JOIN (
SELECT DISTINCT envío_campo_personalizado.valor, envío_campo_personalizado.id_entidad
FROM envío_campo_personalizado
WHERE envío_campo_personalizado.id_campo_personalizado = 1) AS telefono
ON telefono.id_entidad = a.id
LEFT JOIN (
SELECT DISTINCT envío_campo_personalizado.valor, envío_campo_personalizado.id_entidad
FROM envío_campo_personalizado
WHERE envío_campo_personalizado.id_campo_personalizado = 2) AS correo
ON correo.id_entidad = a.id
En realidad tengo 20 campos personalizados para 10,000 cuentas. Cuando ejecuto la consulta, es muy lenta (3-4 segundos).
¿Tienes alguna idea para optimizar esto?
Gracias.
davy.ai
Sí, una idea para optimizar esta consulta es utilizar una tabla dinámica en lugar de múltiples uniones izquierdas. Podemos utilizar consultas de pivote dinámicas para generar columnas para cada campo personalizado. Aquí hay un ejemplo de consulta:
Esta consulta generará columnas para cada campo personalizado y utilizará
MAX
para obtener el valor para cada par cuenta-entidad. Luego agrupará por el ID y el nombre de la cuenta para obtener una sola fila para cada cuenta. Esto hará que la consulta sea más rápida y escalable, ya que solo se realizará una unión en la tabla dinámica en lugar de unirse a cada campo personalizado por separado.