Во-первых, смысл существования (причина существования) реляционной базы данных - это возможность моделировать отношения между сущностями. Объединения - это просто механизмы, с помощью которых мы проходим эти отношения. Они, безусловно, имеют номинальную стоимость, но без объединений нет смысла иметь реляционную базу данных.
В академическом мире мы узнаем о таких вещах, как различные нормальные формы (1-я, 2-я, 3-я, Бойса-Кодда и т. Д.), И мы узнаем о различных типах ключей (первичный, внешний, альтернативный, уникальный и т. Д.) И о том, как эти вещи подходят друг другу для создания базы данных. И мы изучаем основы SQL, а также манипулируем структурой и данными (DDL и DML).
В корпоративном мире многие академические конструкции оказываются существенно менее жизнеспособными, чем нас заставляли думать. Прекрасный пример - понятие первичного ключа. С академической точки зрения это тот атрибут (или набор атрибутов), который однозначно определяет одну строку в таблице. Таким образом, во многих проблемных областях правильный академический первичный ключ состоит из 3 или 4 атрибутов. Однако почти все в современном корпоративном мире используют автоматически сгенерированное последовательное целое число в качестве первичного ключа таблицы. Зачем? Две причины. Во-первых, это делает модель намного чище, когда вы переносите FK повсюду. Второй и наиболее уместный для этого вопроса заключается в том, что получение данных с помощью объединений выполняется быстрее и эффективнее для одного целого числа, чем для 4 столбцов varchar (как уже упоминалось некоторыми людьми).
Давайте теперь углубимся в два конкретных подтипа реальных баз данных. Первый тип - это транзакционная база данных. Это основа для многих приложений электронной коммерции или управления контентом, управляющих современными сайтами. С транзакционной БД вы сильно оптимизируете «пропускную способность транзакций». Большинство приложений для торговли или контента должны сбалансировать производительность запросов (из определенных таблиц) с производительностью вставки (в других таблицах), хотя каждое приложение будет решать свои собственные уникальные бизнес-задачи.
Второй тип реальных баз данных - это база данных отчетов. Они используются почти исключительно для агрегирования бизнес-данных и создания содержательных бизнес-отчетов. Как правило, они имеют форму, отличную от формы баз данных транзакций, в которых генерируются данные, и в значительной степени оптимизированы для скорости массовой загрузки данных (ETL) и производительности запросов с большими или сложными наборами данных.
В каждом случае разработчик или администратор баз данных должен тщательно сбалансировать кривые функциональности и производительности, и есть множество приемов повышения производительности с обеих сторон уравнения. В Oracle вы можете делать то, что называется «планом объяснения», чтобы вы могли конкретно видеть, как запрос анализируется и выполняется. Вы хотите максимально использовать индексы в БД. Одно действительно неприятное запрещение - это поместить функцию в предложение where запроса. Каждый раз, когда вы это делаете, вы гарантируете, что Oracle не будет использовать какие-либо индексы в этом конкретном столбце, и вы, вероятно, увидите полное или частичное сканирование таблицы в плане объяснения. Это всего лишь один конкретный пример того, как можно написать запрос, который в конечном итоге оказывается медленным и не имеет ничего общего с соединениями.
И хотя мы говорим о сканировании таблиц, очевидно, что они влияют на скорость запроса пропорционально размеру таблицы. Полное сканирование таблицы из 100 строк даже не заметно. Запустите тот же запрос к таблице со 100 миллионами строк, и вам нужно будет вернуться на следующей неделе, чтобы получить результат.
Поговорим о нормализации минутку. Это еще одна в значительной степени положительная академическая тема, которую можно переоценить. В большинстве случаев, когда мы говорим о нормализации, мы действительно имеем в виду устранение повторяющихся данных путем помещения их в отдельную таблицу и переноса FK. Люди обычно пропускают всю зависимость, описываемую 2NF и 3NF. И все же в крайнем случае, безусловно, возможно иметь совершенную базу данных BCNF, которая огромна и полная зверюга для написания кода, потому что она настолько нормализована.
Итак, где нам балансировать? Нет лучшего ответа. Все лучшие ответы, как правило, представляют собой некоторый компромисс между простотой обслуживания структуры, простотой обслуживания данных и простотой создания / обслуживания кода. В общем, чем меньше дублирование данных, тем лучше.
Так почему же соединения иногда бывают медленными? Иногда это плохой реляционный дизайн. Иногда это неэффективная индексация. Иногда это проблема с объемом данных. Иногда это ужасно написанный запрос.
Приносим извинения за такой многословный ответ, но я чувствовал себя обязанным предоставить более содержательный контекст моих комментариев, а не просто болтать ответ из четырех пунктов.