使用NHibernate删除带有复合键的表的前X行

时间:2013-02-06 08:34:01

标签: sql nhibernate

我们有下表:

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。

2 个答案:

答案 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小时后删除任何值。如果该查询也超时,请减少删除成功之前的小时数。完成这项工作,直到找不到更多值来清理数据库。