Sütun veri türünü salt meta veri işlemi olarak değiştirmenin bir yolu var mı?
Ben öyle düşünmüyorum, ürün şu anda böyle çalışıyor. Joe'nun cevabında önerilen bu sınırlama için gerçekten harika bazı çözümler var .
... SQL Server'ın tüm tabloyu yeniden yazmasına neden olur (ve günlük alanında 2x tablo boyutu kullanılır)
Bu ifadenin iki kısmına ayrı ayrı cevap vereceğim.
Tabloyu Yeniden Yazma
Daha önce de belirttiğim gibi, bundan kaçınmanın hiçbir yolu yoktur. Bu, müşteriler olarak bizim açımızdan tam anlam ifade etmese bile, durumun gerçekliği gibi görünüyor.
DBCC PAGE
Sütunu 4000'den 260'a değiştirmeden önce ve sonra bakıldığında, tüm verilerin veri sayfasında çoğaltıldığını gösterir (test 'A'
masamın satırında 260 kez vardı ):
Bu noktada, sayfada aynı verilerin iki kopyası bulunur. "Eski" sütun esasen silinir (id, id = 2 yerine id = 67108865 olarak değiştirilir) ve sütunun "yeni" sürümü, sayfadaki verilerin yeni ofsetini gösterecek şekilde güncellenir:
Günlük Alanında 2x Tablo Boyutunu Kullanma
Ekleme WITH (ONLINE = ON)
sonuna ALTER
açıklamada yaklaşık yarı yarıya günlük aktivitesini azaltan bu size gereken bir disk / disk alanı için yazma miktarını azaltmak için yapabilir bir gelişme yani.
Bu test kayışını denemek için kullandım:
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
İfadeyi sys.dm_io_virtual_file_stats(DB_ID(N'248749'), DEFAULT)
çalıştırmadan önce ve sonra kontrol ettim ALTER
ve işte farklar:
Varsayılan (Çevrimdışı) ALTER
- Veri dosyası yazar / yazılır bayt: 34.809 / 2.193.801.216
- Günlük dosyası yazıyor / yazılan bayt: 40.953 / 1.484.910.080
İnternet üzerinden ALTER
- Veri dosyası yazar / yazılır bayt: 36.874 / 1.693.745.152 (% 22.8 düşüş)
- Günlük dosyası yazıyor / yazılan bayt: 24.680 / 866.166.272 (% 41 düşüş)
Gördüğünüz gibi, veri dosyasında hafif bir düşüş vardı ve günlük dosyasında büyük bir düşüş var.