勝手にPASSJ連動企画
レコード数が多いテーブルを適正なレコード数にする方法です。
たとえばログ系ってテーブルにINSERTしていくとアクセス数なんかによっては膨大になりがちです。
今回の投稿では100万件を50万件に絞りたい。それをDELETE T_ACCLOG WHERE ID < 500000とかってすると4時間かかってしまい問題だということのようです。
そんな設計はダメとかはひとまずおいておくと1番はじめに思い浮かぶキーワードはサイクリック
INSERT INTO T_ACCLOG(USER_AGENT) VALUES('IE');
DELETE T_ACCLOG WHERE ID < @@IDENTITY - 500000;
こうしておくと、50万件のレコード数に抑制されるはずです。(ただしIDENTITYカラムが抜けたりして実際には50万件弱になるがそのあたりの細かいことは問わない前提)
ただし、今回は100万件を50万件に収めないといけないのに、その処理が4時間かかるということですから更新するたびにちょっとずつ減らしていけばいいのです。
上記のコードの500000という数字が残るレコード数なので、1000000~ちょっとずつデクリメントしていけばいいので、
CREATE TABLE dbo.T_RECCOUNT (
TABLENAME varchar(50) NOT NULL,
KENSU int NOT NULL
) ON [PRIMARY]
GO
INSERT INTO T_RECCOUNT VALUES('T_ACCLOG', 1000000)
こんな感じでカウンタテーブルを用意して
INSERT INTO T_ACCLOG(USER_AGENT) VALUES('IE');
DECLARE @KENSU int
SELECT @KENSU=KENSU FROM T_RECCOUNT WHERE TABLENAME = 'T_ACCLOG'
DELETE T_ACCLOG WHERE ID < @@IDENTITY - @KENSU;
UPDATE T_RECCOUNT SET KENSU = @KENSU-2 WHERE TABLENAME = 'T_ACCLOG'
こんな感じで2件ずつデクリメントしていくとちょっとずつ適正数に向かって近づいていくことになります。
遅い処理を早くするのは大変ですが、ばらして気づかないようにしておくっていうのが実は一番効率的です。
プログラムの方で仕掛けずらい場合にはトリガにかませればほとんどわかりません。
それだけにメンテ難しいのであまり好きじゃないのですが、ま、そこはお好みで。