关于在SQL Server 2008上存储气象数据的设计问题

时间:2011-05-16 09:48:27

标签: sql-server sql-server-2008 data-compression database-design

我们正在使用SQL Server 2008 R2企业版。

我们正在测量MetMasts的气象数据。 基本上这是一个有很多设备的桅杆;在桅杆,温度计和气压的不同位置的风速计(用于风速)。 我们每秒测量一次。

它占用了太多的磁盘空间。 下一代此设备每年将产生超过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)

数据写入一次,多次读取 我们在我们的数据仓库中使用它,这是一个典型的问题;计算当温度高于20度时,每个MetMast,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非常大),所以它也适用于我们。

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

致以最诚挚的问候,

Henrik Staun Poulsen

2 个答案:

答案 0 :(得分:2)

对于每个数据点,请考虑存储所需的准确度。

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个字节,不包括实际的可变长度数据本身。

答案 1 :(得分:1)

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