Genel işlem muhtemelen daha fazla genel kilitleme yüküyle çok daha yavaş olacaktır, ancak yalnızca işlem günlüğü boyutunu önemsiyorsanız aşağıdakileri deneyebilirsiniz.
- Kimliği olmayan tamsayı olmayan bir tamsayı sütunu ekleyin (yalnızca meta verilerde değişiklik).
- Bu işlemi, toplu işlerde benzersiz sıralı tam sayılarla güncellemek için kod yazın. Bu, her bir işlemin boyutunu azaltacaktır ve günlük boyutunu düşürecektir (basit kurtarma modeli varsayılarak). Aşağıda yer alan kodum, 100'lük partiler halinde, umarız uzun bir süredir sona erecek olan tekrarlanan taramalardan ziyade bıraktığınız yerden almak için kullanabileceğiniz mevcut bir PK'nize sahip olduğunuzu umar.
- Sütunu
NOT NULL
olarak işaretlemek için ALTER TABLE ... ALTER COLUMN
kullanın. Bu, değişikliğin doğrulanması için çok sayıda günlüğe gerek duyulmadan tüm tablonun kilitlenmesini ve taranmasını gerektirir.
- Sütunu bir kimlik sütunu yapmak için
ALTER TABLE ... SWITCH
kullanın. Bu bir meta veri sadece değişikliktir.
Örnek Kod Aşağıda
/*Set up test table with just one column*/
CREATE TABLE table_1 (original_column INT)
INSERT INTO table_1
SELECT DISTINCT
number
FROM master..spt_values
/*Step 1 */
ALTER TABLE table_1 ADD id INT NULL
/*Step 2 */
DECLARE @Counter INT = 0 ,
@PrevCounter INT = -1
WHILE @PrevCounter <> @Counter
BEGIN
SET @PrevCounter = @Counter;
WITH T AS (SELECT TOP 100
* ,
ROW_NUMBER() OVER (ORDER BY @@SPID)
+ @Counter AS new_id
FROM table_1
WHERE id IS NULL
)
UPDATE T
SET id = new_id
SET @Counter = @Counter + @@ROWCOUNT
END
BEGIN TRY;
BEGIN TRANSACTION ;
/*Step 3 */
ALTER TABLE table_1 ALTER COLUMN id INT NOT NULL
/*Step 4 */
DECLARE @TableScript NVARCHAR(MAX) = '
CREATE TABLE dbo.Destination(
original_column INT,
id INT IDENTITY(' + CAST(@Counter + 1 AS VARCHAR) + ',1)
)
ALTER TABLE dbo.table_1 SWITCH TO dbo.Destination;
'
EXEC(@TableScript)
DROP TABLE table_1 ;
EXECUTE sp_rename N'dbo.Destination', N'table_1', 'OBJECT' ;
COMMIT TRANSACTION ;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION ;
PRINT ERROR_MESSAGE() ;
END CATCH ;
Bu MySQL, SQL Server, PostGres, Oracle mı? – JNK
günlüğü devre dışı bırak, sütun ekle, etkinleştirme günlüğü. –
Bu bir cevap değil, sadece bir yorum değil midir? –