0

让我先说我的SQL经验有限,但是我搜索了几天以找到解决我问题的好方法,但我还没有找到。如果存在明显的答案,我没有使用正确的关键词来找到它。

我有一个硬件数据收集系统,它将系统运行状况行插入表中,在很长一段时间内每 10 分钟插入 1 个。这些数据用作硬件故障时的诊断信息。该表包含使用唯一 DeviceID 列标识的多个设备的记录。我计划在此表中为每个设备最多保留 100K 条记录。我计划偶尔使用以下算法压缩表:

当特定 DeviceID 的行数超过 100K 时,为特定 DeviceID 选择最旧的 50% 行,并从选择中的第 2 行开始每隔 2 行删除一次。

该算法具有所需的特性,即最近的数据以 10 分钟的间隔保留,而较旧的数据会在时间上逐渐散开。第一个(最旧的)记录也永远不会被删除。

我可以在 C# 中轻松实现这一点,在查询后删除多个单行以选择最旧的 50K 行。我希望有人知道更好的方法来做到这一点。

如果它有帮助,我可以重新组织数据,以便每个设备都有一个不同的表,但这会使在 C# 中的单个虚拟化网格视图中呈现数据以供审查变得复杂。

谢谢你的帮助。

4

1 回答 1

0

我想我在这里使用公用表表达式找到了解决问题的方法(删除每 n 行 SQL )。在下面的代码中,HealthID 是我的 DeviceHealth 表中的索引。DeviceID = 1 子句仅用于测试。实际代码将使用参数而不是 1。

WITH cte AS (
    SELECT TOP 50 PERCENT t.*, ROW_NUMBER() OVER (ORDER BY t.HealthID)
        AS rank FROM [DeviceHealth] t WHERE DeviceID = 1)
DELETE cte WHERE rank%2 != 0

这似乎有效。有没有更好的方法或找到一个好的解决方案?

于 2013-04-04T06:15:39.113 回答