Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách thêm cột nhận dạng vào bảng cơ sở dữ liệu hiện có có số lượng hàng lớn

Quá trình tổng thể có thể sẽ chậm hơn rất nhiều với tổng chi phí khóa tổng thể nhiều hơn nhưng nếu bạn chỉ quan tâm đến kích thước nhật ký giao dịch, bạn có thể thử các cách sau.

  1. Thêm một số nguyên không có giá trị cột không nhận dạng (chỉ thay đổi siêu dữ liệu).
  2. Viết mã để cập nhật điều này với các số nguyên tuần tự duy nhất theo lô. Điều này sẽ làm giảm kích thước của từng giao dịch riêng lẻ và giữ cho kích thước nhật ký giảm xuống (giả sử mô hình khôi phục đơn giản). Mã của tôi dưới đây thực hiện điều này theo lô 100, hy vọng rằng bạn có PK hiện tại, bạn có thể tận dụng để tiếp tục nơi bạn đã dừng lại thay vì quét lặp đi lặp lại sẽ mất nhiều thời gian hơn cho đến cuối.
  3. sử dụng ALTER TABLE ... ALTER COLUMN để đánh dấu cột là NOT NULL . Điều này sẽ yêu cầu toàn bộ bảng được khóa và quét để xác thực thay đổi nhưng không yêu cầu ghi nhật ký nhiều.
  4. Sử dụng ALTER TABLE ... SWITCH để làm cho cột này trở thành một cột nhận dạng. Đây là một thay đổi chỉ về siêu dữ liệu.

Mã mẫu bên dưới

/*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 ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008:Vô hiệu hóa chỉ mục trên một phân vùng bảng cụ thể

  2. Sử dụng đúng các giao dịch trong SQL Server

  3. unsigned right shift '>>>' Toán tử trong máy chủ sql

  4. Thay thế cho việc sử dụng các biến cục bộ trong mệnh đề where

  5. cách chuyển đổi tất cả các cột datetime trong cơ sở dữ liệu sql server 2005 express với dữ liệu sang UTC