我正在构建一个应用程序,它将汽车性能指标记录到一个由每个会话 100 列 X 500,000 行组成的表中。一些列非常重复(以华氏度为单位的冷却剂温度)。其他列不断变化(火花提前、歧管压力、空燃比)。
列存储和页面压缩是不可能的,因为该项目是针对开源受众的。它需要支持 MS SQL Express Edition 或其他可以很好地扩展到大表大小的免费数据库平台。
我最初的解决方案是在某些列中允许为 null,这样可以通过不插入重复值来显着减少存储空间,这使我可以将日志分辨率提高到更高的帧速率。
然而,这在选择离散行时引入了一个障碍,因为某些列将 99% 为空。因此,有必要创建一个视图(或计算列?),它将选择包含该字段中的值的最后一行。我的方法是对每个稀疏列使用子查询。这似乎非常不雅。我应该考虑一种更有效的方法吗?
SELECT ISNULL(
val1,
(
SELECT TOP 1 val1
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val1 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val1,
ISNULL(
val2,
(
SELECT TOP 1 val2
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val2 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val2,
ISNULL(
val3,
(
SELECT TOP 1 val3
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val3 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val3
FROM [values] v