テーブルの 1 つに 42,715,078 エントリがあり、TOP 42,715,000 行を削除したい (78 エントリだけを保持したい)。
誰が私にそれができるか知っていますか??
PS: テーブルを削除したくありません。テーブルのエントリを削除したいだけです。
テーブルの 1 つに 42,715,078 エントリがあり、TOP 42,715,000 行を削除したい (78 エントリだけを保持したい)。
誰が私にそれができるか知っていますか??
PS: テーブルを削除したくありません。テーブルのエントリを削除したいだけです。
おそらく最善の策は、一時テーブルに保持したい 78 行を選択してから、テーブルを切り捨てて挿入し直すことです。
SELECT * INTO #temp FROM TableName WHERE <Condition that gets you the 78 rows you want>
または、特定の 78 行がない場合
SELECT TOP 78 * INTO #temp FROM TableName
それで
TRUNCATE TABLE TableName
最後になりましたが、重要なことです
INSERT INTO TableName
SELECT * FROM #temp
この方法で行うと、78 行を取得するために使用する条件に応じてかなり高速になるはずであり、TRUNCATE は最小限しかログに記録されないため、ログの肥大化を回避できます。
月に 1 回切り捨てるアクティビティ ログがあります。(毎月のバックアップを保持しているため、必要に応じて古いデータに戻すことができます。) テーブルが毎月大きくなり、私たちのように小さく保ちたい場合は、SQL エージェント ジョブを設定できます。毎月実行します。
データベースの負荷を維持するために、一度に 5000 行しか削除しないため、このジョブは 2 分ごとに 1 時間実行されます。これにより、データベースをロックせずに最も古い行をすべて削除するのに十分な時間が与えられます。
DECLARE @LastDate DateTime -- We remove the oldest rows by month
DECLARE @NumberOfRows INT -- Number of rows to keep
-- Set the Date to the current date minus 3 months.
SET @LastDate = DATEADD(MM, -3, GETDATE())
-- Since it runs on the first Saturday of each month, this code gets it
back to the first of the monh.
SET @LastDate = CAST(CAST(DATEPART(YYYY, @LastDate) AS varchar) + '-' + CAST(DATEPART(MM, @LastDate) AS varchar) + '-01' AS DATETIME)
-- We use 5000.
SET @NumberOfRows = 5000
DELETE TOP (@NumberOfRows) FROM MyTable WHERE Created < @LastDate
わかった。
DELETE TOP (42715000)
FROM <tablename>
WHERE <condition>
とてもうまくいきました!