Назад | Перейти на главную страницу

Нормализация SQL Server для повышения производительности

У меня есть стол

create table Objects (
    ObjectID bigint not null primary key,
    ObjectRef1 varchar(50) not null,
    ObjectRef2 varchar(50) not null,
    ObjectRef3 varchar(250) not null 
)

Все поля уникальны. В таблице примерно 100 миллионов строк. Все столбцы имеют уникальные индексы и часто используются для запросов.

Что быстрее? Нормализовать каждое из полей varchar в отдельные таблицы или оставить их такими, какие они есть? Если нормализовать, таблица будет иметь только столбец ObjectID и идентификаторы для нормализованных таблиц, и я бы сделал внутренние соединения, чтобы получить значения ObjectRefX.

Стоит ли рассматривать другие базы данных, такие как Hadoop, для такого объема данных?

Судя по вашему описанию, нормализация таблицы будет лучшим выбором из-за снижения активности диска. Конкуренция ввода-вывода является наиболее серьезным узким местом в большинстве систем. Если вы нормализуете, вы уменьшите размер каждой строки, и, поскольку SQL Server читает данные с диска на страницах, меньшие строки приводят к большему количеству строк на страницу и меньшему количеству страниц, которые нужно читать с диска.

Однако это изменяется, если вам нужно использовать столбцы ObjectRefX вместе (например, «SELECT ObjectRef1, ObjectRef2» или «WHERE ObjectRef1 = 'x' AND ObjectRef2 = 'y'»). Если это так, накладные расходы на объединения, вероятно, компенсируют любые преимущества нормализации.

И, отвечая на ваш другой вопрос, нет, 100 миллионов строк не проблема для хорошо организованной базы данных SQL Server. Многие компании имеют базы данных размером в терабайт с миллиардами строк. Единственное предостережение: чем больше становится база данных, тем больше требуется управления для ее нормальной работы, но это верно для любой большой базы данных на любой платформе.