У нас есть база данных, в которой хранятся большие объемы данных измерений следующим образом.Комбинированный первичный ключ против одиночного целого первичного ключа большой таблицы
- Существует таблица под названием «Инструмент», где каждый интрумент имеет первичный ключ из трех столбцов [CustomerCode | LocationCode | InstrumentCode]. Колонки типа VARCHAR (4), поэтому полный первичный ключ выглядит как ABC | L001 | S001. Эти коды имеют смысл для нас, поэтому мы не можем просто изменить их для целых чисел. Другие отношения ar также определены на этих столбцах, но они не подходят для этого вопроса. В этой таблице содержится около 200 000 строк, представляющих различные точки данных измерений.
- Существует таблица под названием «InstrumentLoggings», где каждый InstrumentLogging имеет первичный ключ из четырех столбцов [CustomerCode | LocationCode | InstrumentCode | Отметка]. Столбец Timestamp имеет тип DateTime. Отношение внешних ключей определяется в первых трех столбцах таблицы «Инструмент». Затем есть пятое поле типа VARCHAR (25), содержащее значение для этой метки времени. В этих таблицах содержится около 5 миллиардов записей (это возмутительно или это совсем не плохо?).
Вот короткая схема текущей ситуации:
Наша проблема в том, что таблица InstumentLoggings растет над 200GB, и производительность начинает уменьшаться. Кроме того, резервное копирование и восстановление слишком трудоемки. Мы ищем способы устранить все эти поля первичных ключей в одном поле в таблице InstrumentLoggings.
Могу ли я просто добавить дополнительную таблицу InstrumentId на таблицу Instrument и создать таблицу InstrumentLoggings с тремя коллами [InstrumentId | Временная метка | Значение], где первичный ключ состоит из столбцов InstrumentId и Timestamp? Или лучше для производительности добавить дополнительный столбец InstrumentLoggingId к предыдущей идее?
На следующем изображении вы можете увидеть таблицу протоколирования, как сейчас, и две альтернативы. Мне очень любопытно, о своих мыслях, и если есть какие-то альтернативы я не вижу сейчас ...
Если никакая другая таблица не связана с instrumentLoggings, я не вижу преимущества добавления другого столбца в качестве первичного ключа. InstrumentId в сочетании с Timestamp может оставаться первичным ключом этой таблицы. Что касается места хранения, вы сохраните добавление столбца InstrumentId - он заменяет 18 байтов на 4 байта для каждой записи в таблице. –
Поскольку это, кажется, новая разработка, я бы предложил не использовать имя Timestamp. Мало того, что тип данных в sql-сервере не имеет никакого отношения к дате или времени, он невероятно неоднозначен. Что-то вроде DateAdded - намного лучшее и четкое имя. Я также попытался бы избежать имен столбцов, таких как Value. для рассматриваемой проблемы я, вероятно, использовал бы идентификатор как часть составного ключа вместо значения datetime. –
Уменьшение информации, представленной в таблице InstrumentLoggings, может привести к дополнительным объединениям, необходимым для восстановления этой информации в запросах. Производительность зависит от ваших запросов и наличия подходящих индексов для их поддержки. Вы должны основывать оптимизацию на фактическом тестировании и РАЗРАБОТАТЬ ваши запросы. – reaanb