কেবলমাত্র মেটাডেটা অপারেশন হিসাবে কলামের ডেটা ধরণের পরিবর্তন করার কোনও উপায় আছে?
আমার মনে হয় না, এখনই পণ্যটি এভাবে কাজ করে। জো এর উত্তরে প্রস্তাবিত এই সীমাবদ্ধতার জন্য কিছু সত্যই দুর্দান্ত কাজ রয়েছে ।
... এসকিউএল সার্ভারের ফলাফলটি পুরো টেবিলটি পুনরায় লিখন করে (এবং লগ স্পেসে 2x টেবিল আকার ব্যবহার করে)
আমি এই বিবৃতি দুটি অংশ পৃথকভাবে প্রতিক্রিয়া করতে যাচ্ছি।
সারণীটি পুনরায় লেখা হচ্ছে
যেমনটি আমি আগেই বলেছি, এটি এড়াতে আসলেই কোনও উপায় নেই। এটি পরিস্থিতির বাস্তবতা বলে মনে হচ্ছে, যদিও এটি গ্রাহক হিসাবে আমাদের দৃষ্টিকোণ থেকে সম্পূর্ণ উপলব্ধি করে না।
এ খুঁজছি DBCC PAGEআগে ও 4000 260 দেখায় যে তথ্য সমস্ত ডেটা পৃষ্ঠাতে সদৃশ থেকে কলাম পরিবর্তন করার পর (আমার পরীক্ষা টেবিল ছিল 'A'সারিতে 260 বার):

এই মুহুর্তে, পৃষ্ঠায় সঠিক একই তথ্যের দুটি অনুলিপি রয়েছে। "পুরানো" কলামটি মূলত মুছে ফেলা হয়েছে (আইডিটি আইডি = 2 থেকে আইডি = 67108865 এ পরিবর্তিত হয়েছে), এবং কলামটির "নতুন" সংস্করণটি পৃষ্ঠায় ডেটার নতুন অফসেটের দিকে নির্দেশ করতে আপডেট করা হয়েছে:

লগ স্পেসে 2x সারণী আকার ব্যবহার করা
বিবৃতিটির WITH (ONLINE = ON)শেষে যুক্ত করা লগিং ক্রিয়াকলাপকে প্রায় অর্ধেক দ্বারা হ্রাস করে , তাই ডিস্ক / ডিস্কের জন্য প্রয়োজনীয় জায়গাগুলিতে লেখার পরিমাণ হ্রাস করতে আপনি এটি করতে পারেন improvementALTER
আমি এই পরীক্ষার জোতা ব্যবহার করে দেখতে চেষ্টা করেছি:
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% ড্রপ)
আপনি দেখতে পাচ্ছেন যে ডেটা ফাইলের লেখায় কিছুটা ড্রপ ছিল এবং লগ ফাইলের মধ্যে একটি বড় ড্রপ লিখেছে।