Вопрос о разработке для хранения метеорологических данных на SQL Server 2008 - PullRequest
2 голосов
/ 16 мая 2011

Мы используем SQL Server 2008 R2 Enterprise Edition.

Мы измеряем метеорологические данные из того, что мы называем MetMasts.В основном это мачта с большим количеством оборудования;анемометры (для определения скорости ветра) в разных положениях на мачте, термометры и давление воздуха.Мы измеряем каждую секунду.

И это занимает слишком много места на диске.Следующее поколение этого оборудования будет генерировать более 10 ГБ в год каждый.И у нас их будет более 1000.

Текущий дизайн таблицы выглядит примерно так:

    CREATE TABLE #MetMast (
    MetMastID INT NOT NULL IDENTITY(1,1), 
    MetMastName NVARCHAR(100), 
    CountryID INT, 
    InstallDate DATE
)
    CREATE TABLE #MetMastData (
        MetMastDataID BIGINT NOT NULL IDENTITY(1,1),
        MetMastID INT NOT NULL,
        MeasuredAt DATETIME2(0) NOT NULL,
        Temperature REAL NULL,
        WindSpeedAt10m REAL NULL, 
        WindSpeedAt30m REAL NULL,
        AirPressure REAL NULL,
        OneHundredMoreColumns VARCHAR(200),
     CONSTRAINT PK_MetMastData PRIMARY KEY CLUSTERED 
    (
        MetMastID ASC,
        MeasuredAt ASC
    ))
    WITH (DATA_COMPRESSION = ROW) 
    -- ON a file group, with table partitioning
    ALTER TABLE #MetMastData WITH NOCHECK ADD CONSTRAINT FK_MetMast_MetMastID FOREIGN KEY (#MetMast) REFERENCES #MetMast(MetMastID)

Данные записываются один раз, читаются много, много раз.
Мы используем его в нашем хранилище данных, где будет типичный вопрос;Посчитайте, сколько раз разница между WindSpeedAt10m и WindSpeedAt30m составляет 2 м / с, если температура превышает 20 градусов, для MetMast.

SELECT MetMastId, COUNT_BIG(*) FROM #metMastData 
WHERE temperature>20 AND ABS(WindSpeedAt10m-WindSpeedAt30m) >2 
GROUP BY MetMastID

В будущем возможна небольшая потеря данных.
Мы говорим о сжатии данных с потерями.Я знаю, что нам нужно будет определить приемлемую ошибку для каждого из полей, например, в 1%, если мы измеряем с точностью до 10%.
Он работал для звуковых файлов (MP3 довольно большой), поэтому он может работать для нас какхорошо.

Но как это сделать?
Какой дизайн таблицы мне выбрать?
Как начать работу со сжатием данных с потерями в таблицах базы данных?

С уважением,

Хенрик Стаун Поульсен

Ответы [ 2 ]

2 голосов
/ 16 мая 2011

Для каждой из ваших точек данных учитывайте точность, которую необходимо сохранить.

REAL занимает четыре байта для каждой строки.Если бы вы могли отбросить все десятичные разряды для WindSpeed, вы могли бы сделать это с tinyint (1 байт, 1-255).Учитывая, что вам, скорее всего, нужна некоторая точность, вы можете вместо этого использовать smallint и умножить фактическое значение на 100:

150,55 m/s = 15055
3,67 m/s = 367

Это сэкономит вам два байта на строку и сохранит некоторую точность, хотя и с потерей накакой-то момент.Поскольку кажется, что у вас будет довольно много этих столбцов, экономия 2 байтов на каждый столбец будет достаточно большой.

У вас есть 8-байтовый bigint для вашего MetMastDataID.Это необходимо?Разве все не будет запрошено MetMastID и MeasuredAT?Сброс, который сэкономит вам 8 байтов.Однако это приведет к фрагментации, поскольку ваш кластерный ключ больше не будет последовательным, поэтому потребуется дефрагментация.Поскольку это похоже на систему архивирования / OLAP, это не должно быть большой проблемой.

РЕДАКТИРОВАТЬ: я только что понял, что вы не кластеризованы на MetMastDataID, поэтому фрагментация не изменится с этого момента.Тогда возникает вопрос - вы когда-нибудь используете MetMastDataID для чего-либо?

Далее - если вы можете избежать всех столбцов переменной длины, это сэкономит вам 2 байта + 2 байта на столбец переменной длины, накладные расходы на запись, на строку, не включая сами данные фактической переменной длины.

1 голос
/ 16 мая 2011

Сжатие с потерями основано на физических возможностях человека определять разницу глазом или ухом.Примерами являются Mp3 или JPEG сжатие с потерями.В вашем случае такое сжатие с потерями не имеет смысла, потому что вы работаете с цифрами, а не с аудио / видео данными.Для реализации сжатия без потерь вы можете использовать функцию CLR. Пример здесь: http://www.codeproject.com/KB/database/blob_compress.aspx.

...