1

我们有下表:

CREATE TABLE TagValueDouble(
    TagIdentity [int] NOT NULL,
    TimestampInUtcTicks [bigint] NOT NULL,
    DoubleValue [float] NULL,
CONSTRAINT [PK_TagValueDouble] PRIMARY KEY CLUSTERED 
(
    TagIdentity ASC,
    TimestampInUtcTicks ASC
)

该表充满了来自不同来源(例如风速)的许多测量值。TagIdentity,代表来源,结合时间戳代表唯一的记录。

这个表变大了,比如 2000 个不同的源,更新率为 2Hz。

不经常,但有时我们删除一个源,我们需要删除表中该源的所有记录。问题是使用 NHibernate 查询超时。

我的计划是一次删除 X 行不再属于系统的记录。类似的东西:

DELETE FROM TagValueDouble 
WHERE TagIdentity in
(SELECT TOP 10 TagIdentity, TimestampInUtcTicks
  FROM TagValueDouble
  Where TagIdentity not in (12, 14))

但这不起作用。

关于如何在不冒超时风险的情况下清理桌子的任何想法?

我正在寻找稳定性而不是性能。删除源的所有值是很少做的事情。

PS。它必须在 SQL Server、Oracle、Posgres 和 SQL CE 上工作。

4

2 回答 2

0

您似乎缺少 TagIdentity 上的索引。创建索引并确保在删除记录之前正确填充它。

于 2013-02-06T08:38:30.263 回答
0

一个想法是做这样的事情:

DELETE FROM TagValueDouble
WHERE (TagIdentity + 4000) * 315360000000000 + TimestampInUtcTicks IN
(SELECT TOP 1000 (TagIdentity + 4000) * 315360000000000 + TimestampInUtcTicks 
 FROM TagValueDouble
 WHERE TagIdentity NOT IN (5, 10, 12, 13))

理由是我不希望系统在 4000 年运行。所以我将 TagIdentity 和 TimestampInUtcTicks 组合为一个唯一值。但这最终检查了表中的所有整数。

我最终得到的是查询一个不在“允许的”TagIdentity 集中的值。然后从该值时间戳和 24 小时前删除任何值。如果该查询也超时,请减少删除成功前的小时数。执行此工作直到找不到更多值来清理数据库。

于 2013-02-07T09:46:16.407 回答