Целесообразно ли разделять данные на разные таблицы, основываясь на значении столбца? - PullRequest
3 голосов
/ 21 октября 2010

Если у меня большая таблица со столбцом, который имеет довольно ограниченный диапазон значений (например, <100), разумно ли разделить эту таблицу на несколько таблиц с именами, привязанными к этому значению столбца? </p>

Например, таблица, подобная столбцам:

table "TimeStamps": [Id] [DeviceId] [MessageCounter] [SomeData]

, где [DeviceId] - столбец «ограниченного диапазона», будет разделена на несколько разных таблиц:

table "TimeStamps1": [Id] [MessageCounter] [SomeData]
table "TimeStamps2": [Id] [MessageCounter] [SomeData]
...
table "TimeStampsN": [Id] [MessageCounter] [SomeData]

Проблема, с которой я сталкиваюсьМоя оригинальная таблица состоит в том, что нахождение наибольшего значения MessageCounter для некоторых значений DeviceId выполняется очень долго (см. this post).

Если таблицы будут разделены, то поиск максимального номера столбца долженбыть операцией O (1).

[Edit]

Просто наткнулся на это, подумал, что я обновлю его.При некоторой правильной настройке индексов и запланированных заданий по реорганизации индексов мне удалось добиться высокой производительности с помощью нормализованной формы.Я рекомендую использовать инструмент SSMS для настройки ядра СУБД для каждого узкого запроса, он очень помог (для кого-то, кто не занимается основной работой - проектирование базы данных).

Ответы [ 4 ]

6 голосов
/ 21 октября 2010

Хотя вы можете сделать это в качестве последней оптимизации производительности, я бы посоветовал против этого.Главным образом потому, что это очень затрудняет размещение новых идентификаторов устройств.

Во всяком случае, делать это не нужно.Если есть индекс для DeviceID, СУБД должна быть в состоянии фильтровать его очень быстро.В конце концов, для этого и нужна СУБД ...

5 голосов
/ 21 октября 2010

Боюсь, что такой подход значительно усложнит любое приложение, которому необходим доступ к этим данным.Альтернативный подход, который дает вам все преимущества, которые вы можете получить, помещая каждое устройство в отдельную таблицу, сохраняя при этом все устройства в одной таблице, состоит в разделении таблицы по DeviceID.Я предлагаю вам изучить разбиение таблиц, чтобы убедиться, что оно соответствует вашим потребностям.

Делитесь и наслаждайтесь.

2 голосов
/ 21 октября 2010

Для этого предназначена распределенная база данных.Серверы совместно используют таблицу в одной базе данных на основе некоторого столбца.Вы говорите серверам, как распределять таблицу, основываясь на диапазонах значений столбцов.Как только это настроено, вы просто запрашиваете таблицу и не заботитесь о том, на каком сервере фактически находятся данные.

1 голос
/ 21 октября 2010

Рассматривали ли вы разделение базы данных?Это запеченный в решении для типа проблемы, которую вы описали.См .: Секционированные таблицы и индексы в SQL Server 2005

...