메타 데이터 전용 작업으로 열 데이터 유형을 변경하는 방법이 있습니까?
나는 그렇게 생각하지 않는다. 이것이 바로 제품이 작동하는 방식이다. Joe의 답변 에서 제안한이 제한에 대한 몇 가지 훌륭한 해결 방법이 있습니다.
... SQL Server에서 전체 테이블을 다시 작성하고 로그 공간에서 2x 테이블 크기를 사용함
나는 그 진술의 두 부분에 개별적으로 응답 할 것입니다.
테이블 재 작성
앞에서 언급했듯이 이것을 피할 수있는 방법은 없습니다. 고객으로서 우리의 관점에서 완전히 이해가되지 않더라도 상황의 현실 인 것 같습니다.
보면 DBCC PAGE
이전과 모든 데이터는 데이터 페이지에 중복되는 4000 260 쇼에서 열을 변경 한 후 (내 테스트 테이블은 한 'A'
행 260 번) :
이 시점에서 페이지에는 정확히 동일한 데이터의 사본이 두 개 있습니다. "이전"열은 기본적으로 삭제되고 (ID는 id = 2에서 id = 67108865로 변경됨) "새"버전의 열은 페이지에서 데이터의 새 오프셋을 가리 키도록 업데이트됩니다.
로그 공간에서 2x 테이블 크기 사용
명령문 WITH (ONLINE = ON)
의 끝에 추가 하면 로깅 활동이 약 절반 으로 줄어들 기 때문에 필요한 디스크 / 디스크 공간에 대한 쓰기 양을 줄일 수있는 개선 사항 중 하나입니다.ALTER
나는이 시험 장치를 사용하여 그것을 시험해 보았다 :
USE [master];
GO
DROP DATABASE IF EXISTS [248749];
GO
CREATE DATABASE [248749]
ON PRIMARY
(
NAME = N'248749',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\DATA\248749.mdf',
SIZE = 2048000KB,
FILEGROWTH = 65536KB
)
LOG ON
(
NAME = N'248749_log',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\DATA\248749_log.ldf',
SIZE = 2048000KB,
FILEGROWTH = 65536KB
);
GO
USE [248749];
GO
CREATE TABLE dbo.[table]
(
id int IDENTITY(1,1) NOT NULL,
[col] nvarchar (4000) NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED (id ASC)
);
INSERT INTO dbo.[table]
SELECT TOP (1000000)
REPLICATE(N'A', 260)
FROM master.dbo.spt_values v1
CROSS JOIN master.dbo.spt_values v2
CROSS JOIN master.dbo.spt_values v3;
GO
문 sys.dm_io_virtual_file_stats(DB_ID(N'248749'), DEFAULT)
을 실행하기 전후에 확인한 ALTER
결과 차이점은 다음과 같습니다.
기본 (오프라인) ALTER
- 데이터 파일 쓰기 / 바이트 쓰기 : 34,809 / 2,193,801,216
- 로그 파일 쓰기 / 바이트 쓰기 : 40,953 / 1,484,910,080
온라인 ALTER
- 데이터 파일 쓰기 / 바이트 쓰기 : 36,874 / 1,693,745,152 (22.8 % 감소)
- 로그 파일 쓰기 / 바이트 쓰기 : 24,680 / 866,166,272 (41 % 감소)
보시다시피, 데이터 파일 쓰기는 약간 떨어졌고 로그 파일 쓰기는 크게 떨어졌습니다.