มีวิธีใดบ้างในการแก้ไขชนิดข้อมูลคอลัมน์เป็นการดำเนินการเฉพาะเมทาดาทา
ฉันไม่คิดอย่างนั้นนี่เป็นวิธีที่ผลิตภัณฑ์ใช้งานได้ในขณะนี้ มีบางวิธีการแก้ปัญหาที่ดีจริงๆข้อ จำกัด นี้เสนอเป็นคำตอบของโจ
... ส่งผลให้ SQL Server เขียนใหม่ทั้งตาราง (และใช้ขนาดตาราง 2x ในพื้นที่บันทึก)
ฉันจะตอบกลับสองส่วนของคำแถลงนั้นแยกจากกัน
เขียนใหม่ตาราง
อย่างที่ฉันได้กล่าวไปแล้วไม่มีทางใดที่จะหลีกเลี่ยงสิ่งนี้ได้ ดูเหมือนว่าจะเป็นความจริงของสถานการณ์แม้ว่ามันจะไม่สมเหตุสมผลจากมุมมองของเราในฐานะลูกค้า
กำลังมองหาที่DBCC PAGE
ก่อนและหลังการเปลี่ยนแปลงคอลัมน์ 4000-260 แสดงให้เห็นว่าข้อมูลทั้งหมดซ้ำในหน้าข้อมูล (ตารางการทดสอบของฉันมี'A'
260 ครั้งในแถว):
ณ จุดนี้มีสำเนาของข้อมูลเดียวกันที่แน่นอนในหน้า คอลัมน์ "เก่า" จะถูกลบโดยหลักแล้ว (id เปลี่ยนจาก id = 2 เป็น id = 67108865) และคอลัมน์รุ่น "ใหม่" ได้รับการอัปเดตให้ชี้ไปที่ออฟเซ็ตใหม่ของข้อมูลในหน้า:
ใช้ 2x Table Size ใน Log Space
การเพิ่ม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%)
อย่างที่คุณเห็นมีการลดลงเล็กน้อยในการเขียนไฟล์ข้อมูลและการบันทึกที่สำคัญในการเขียนไฟล์บันทึก