По мере увеличения громкости выбор из двух таблиц может быть намного быстрее, чем одна . Иногда этот вид рефакторинга (раздела) выполняется в зрелых базах данных для повышения производительности.
Представьте себе, что вы используете это для объединения нескольких таблиц, где некоторые критерии находятся в этой таблице, а другие в разных таблицах.
select from order join customer using (customer_id)
where
order.order_date between ? and ?
and customer.name = ?
Это может привести к извлечению всех order
строк для дат с диска, а затем к выбрасыванию многих из них, поскольку они не соответствуют объединению. Этот выбор с диска должен быть медленным и может испортить ваш кэш RAM.
select from order join order_detail using (order_id) join customer using (customer_id)
where
order.order_date between ? and ?
and customer.name = ?
В этом случае, когда он загружает все order
строки с диска, это не повредит так же плохо, как раньше, потому что таблица уже и меньше. Не нужно загружать все длинные поля, которые не имеют отношения к фильтрации. В конце концов, после соединения с customer
, он будет получать только те строки order_detail
, которые соответствуют всем критериям.
Если вы ожидаете, что это будет большим, вам следует рассмотреть возможность разделения таблицы таким образом, чтобы поля, наиболее важные для поиска, находились в одной таблице, а поля "данные" - в других таблицах "один к одному".
Суть: Нормальная форма и домен - это одно, но производительность часто требует компромиссов . Вы можете скрыть некоторые из них (закрыть разделение видом), но не все (дублировать / агрегировать поля для более быстрого выбора).