En primer lugar, la razón de ser de una base de datos relacional (razón de ser) es poder modelar relaciones entre entidades. Las uniones son simplemente los mecanismos mediante los cuales atravesamos esas relaciones. Ciertamente tienen un costo nominal, pero sin uniones, realmente no hay razón para tener una base de datos relacional.
En el mundo académico aprendemos cosas como las diversas formas normales (1ª, 2ª, 3ª, Boyce-Codd, etc.), y aprendemos sobre diferentes tipos de claves (primaria, extranjera, alternativa, única, etc.) y cómo estas cosas encajan para diseñar una base de datos. Y aprendemos los rudimentos de SQL, además de manipular tanto la estructura como los datos (DDL y DML).
En el mundo empresarial, muchos de los constructos académicos resultan ser sustancialmente menos viables de lo que nos habían hecho creer. Un ejemplo perfecto es la noción de clave primaria. Académicamente, es ese atributo (o colección de atributos) el que identifica de forma única una fila en la tabla. Entonces, en muchos dominios de problemas, la clave primaria académica adecuada es una combinación de 3 o 4 atributos. Sin embargo, casi todo el mundo en el mundo empresarial moderno utiliza un número entero secuencial generado automáticamente como clave principal de una tabla. ¿Por qué? Dos razones. La primera es porque hace que el modelo sea mucho más limpio cuando está migrando FK por todo el lugar. La segunda, y más relacionada con esta pregunta, es que la recuperación de datos a través de combinaciones es más rápida y eficiente en un solo entero que en 4 columnas varchar (como ya lo mencionaron algunas personas).
Profundicemos un poco más ahora en dos subtipos específicos de bases de datos del mundo real. El primer tipo es una base de datos transaccional. Esta es la base de muchas aplicaciones de administración de contenido o comercio electrónico que impulsan los sitios modernos. Con una base de datos de transacciones, está optimizando en gran medida hacia el "rendimiento de transacciones". La mayoría de las aplicaciones comerciales o de contenido tienen que equilibrar el rendimiento de las consultas (de ciertas tablas) con el rendimiento de las inserciones (en otras tablas), aunque cada aplicación tendrá sus propios problemas específicos impulsados por el negocio que resolver.
El segundo tipo de base de datos del mundo real es una base de datos de informes. Estos se utilizan casi exclusivamente para agregar datos comerciales y generar informes comerciales significativos. Por lo general, tienen una forma diferente a las bases de datos de transacciones donde se generan los datos y están altamente optimizadas para la velocidad de carga masiva de datos (ETL) y el rendimiento de consultas con conjuntos de datos grandes o complejos.
En cada caso, el desarrollador o DBA debe equilibrar cuidadosamente tanto la funcionalidad como las curvas de rendimiento, y hay muchos trucos para mejorar el rendimiento en ambos lados de la ecuación. En Oracle, puede hacer lo que se llama un "plan de explicación" para que pueda ver específicamente cómo se analiza y ejecuta una consulta. Está buscando maximizar el uso adecuado de los índices de la base de datos. Un no-no realmente desagradable es poner una función en la cláusula where de una consulta. Siempre que haga eso, garantiza que Oracle no usará ningún índice en esa columna en particular y probablemente verá un escaneo de tabla completo o parcial en el plan de explicación. Ese es solo un ejemplo específico de cómo se podría escribir una consulta que termina siendo lenta y no tiene nada que ver con las combinaciones.
Y mientras hablamos de escaneos de tablas, obviamente impactan en la velocidad de consulta proporcionalmente al tamaño de la tabla. Un escaneo completo de la tabla de 100 filas ni siquiera se nota. Ejecute la misma consulta en una tabla con 100 millones de filas y deberá volver la semana que viene para obtener la devolución.
Hablemos de normalización por un minuto. Este es otro tema académico en gran medida positivo que puede sobrecargarse. La mayoría de las veces, cuando hablamos de normalización, realmente nos referimos a la eliminación de datos duplicados colocándolos en su propia tabla y migrando un FK. La gente suele saltarse todo el asunto de la dependencia descrito por 2NF y 3NF. Y, sin embargo, en un caso extremo, ciertamente es posible tener una base de datos BCNF perfecta que es enorme y una bestia completa contra la que escribir código porque está muy normalizada.
Entonces, ¿dónde nos equilibramos? No existe una única mejor respuesta. Todas las mejores respuestas tienden a ser un compromiso entre la facilidad de mantenimiento de la estructura, la facilidad de mantenimiento de datos y la facilidad de creación / mantenimiento de código. En general, cuanto menos duplicación de datos, mejor.
Entonces, ¿por qué las uniones a veces son lentas? A veces es un mal diseño relacional. A veces es una indexación ineficaz. A veces es un problema de volumen de datos. A veces es una consulta horriblemente escrita.
Perdón por una respuesta tan larga, pero me sentí obligado a proporcionar un contexto más sustancioso en torno a mis comentarios en lugar de simplemente recitar una respuesta de cuatro balas.