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 はソースを表し、タイムスタンプと組み合わせて一意のレコードを表します。

このテーブルは大きくなり、2Hz の更新レートで 2000 の異なるソースがあるとします。

頻繁ではありませんが、ソースを削除して、テーブル内のそのソースのすべてのレコードを削除する必要がある場合があります。問題は、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

1つのアイデアは、次のようなことをすることでした:

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 を 1 つの一意の値に結合します。しかし、これはテーブル内のすべての全体をチェックすることになりました。

私が最終的に得たのは、「許可された」TagIdentity セットにない 1 つの値を照会することでした。次に、その値からタイムスタンプと 24 時間前の値を削除します。そのクエリもタイムアウトした場合は、削除が成功するまでの時間数を減らします。見つかった値がなくなるまでこのジョブを実行すると、データベースがクリーンアップされます。

于 2013-02-07T09:46:16.407 に答える