3

我们使用的是 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 很大),所以它也可能适用于我们。

但是这是怎么做到的呢?
我应该选择什么样的桌子设计?
如何开始对数据库表中的数据进行有损压缩?

最好的祝福,

亨利克·斯坦·波尔森

4

2 回答 2

3

对于您的每个数据点,请考虑您需要存储的准确性。

REAL 每行占用四个字节。如果您可以删除 WindSpeed 的所有小数位,您可能会使用 tinyint(1 字节,1-255)。鉴于您很可能需要一些精度,您可以使用 smallint 并将实际值乘以 100:

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

这将为每行节省两个字节并存储一些精度,尽管在某些时候会有所损失。由于看起来您将拥有相当多的这些列,因此每列节省 2 个字节将相当多。

您的 MetMastDataID 有一个 8 字节的 bigint。有必要吗?MetMastID 和 MeasuredAT 不会查询所有内容吗?删除这将为您节省 8 个字节。然而,它会导致碎片,因为您的集群键将不再是连续的,因此需要进行碎片整理。因为这听起来像是一个档案/OLAP 系统,所以这应该不是什么大问题。

编辑:我刚刚意识到你没有聚集在 MetMastDataID 上,所以从现在起碎片不会改变。那么问题是——你曾经用过 MetMastDataID 吗?

此外-如果您可以避免所有可变长度列,那么每行记录开销的每个可变长度列将为您节省 2 个字节 + 2 个字节,不包括实际的可变长度数据本身。

于 2011-05-16T10:44:52.490 回答
1

有损压缩是基于人类通过眼睛或耳朵确定差异的物理可能性。例如 Mp3 或 JPEG 有损压缩。在您的情况下,这种有损压缩没有意义,因为您使用数字而不是音频/视频数据进行操作。要实现无损压缩,您可以使用 CLR 函数。示例在这里: http: //www.codeproject.com/KB/database/blob_compress.asp x。

于 2011-05-16T11:26:18.053 回答