我们正在使用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
答案 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。