我们使用的是 SQL Server 2008 R2 企业版。
我们正在测量来自我们称之为 MetMast 的气象数据。基本上这是一个有很多设备的桅杆;桅杆上不同位置的风速计(用于风速)、温度计和气压。我们每一秒都在测量。
而且它占用了太多的磁盘空间。该设备的下一代每年将产生超过 10 GB 的容量。我们将拥有超过 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)
数据一次写入,多次读取。
我们在数据仓库中使用它,这是一个典型的问题;根据 MetMast,计算当温度高于 20 度时 WindSpeedAt10m 和 WindSpeedAt30m 之间存在 2 m/s 差异的次数。
SELECT MetMastId, COUNT_BIG(*) FROM #metMastData
WHERE temperature>20 AND ABS(WindSpeedAt10m-WindSpeedAt30m) >2
GROUP BY MetMastID
将来会接受一点点数据丢失。
我们在这里谈论数据的有损压缩。我知道我们必须为每个字段定义一个可接受的错误,如果我们以 10% 的准确度进行测量,则为 1%。
它适用于声音文件(MP3 很大),所以它也可能适用于我们。
但是这是怎么做到的呢?
我应该选择什么样的桌子设计?
如何开始对数据库表中的数据进行有损压缩?
最好的祝福,
亨利克·斯坦·波尔森