我们有下表:
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。
答案 0 :(得分:0)
您似乎错过了TagIdentity的索引。创建索引以确保在删除记录之前正确填充它。
答案 1 :(得分: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小时后删除任何值。如果该查询也超时,请减少删除成功之前的小时数。完成这项工作,直到找不到更多值来清理数据库。