क्या मेटाडेटा-ओनली ऑपरेशन के रूप में कॉलम डेटा प्रकार को बदलने का कोई तरीका है?
मुझे ऐसा नहीं लगता, यह उत्पाद अभी कैसे काम करता है। जोई के जवाब में प्रस्तावित इस सीमा के लिए वास्तव में कुछ महान वर्कअराउंड हैं ।
... SQL सर्वर में संपूर्ण तालिका को फिर से लिखना (और लॉग स्पेस में 2x तालिका आकार का उपयोग करके)
मैं उस कथन के दो भागों का अलग-अलग जवाब देने जा रहा हूं।
तालिका को फिर से लिखना
जैसा कि मैंने पहले उल्लेख किया है, वास्तव में इससे बचने का कोई तरीका नहीं है। यह स्थिति की वास्तविकता प्रतीत होती है, भले ही यह ग्राहकों के रूप में हमारे दृष्टिकोण से पूरी तरह से समझ में न आए।
DBCC PAGE
4000 से 260 तक कॉलम को बदलने से पहले और बाद में देखने से पता चलता है कि डेटा पृष्ठ पर सभी डेटा डुप्लिकेट है (मेरी परीक्षण तालिका 'A'
में पंक्ति में 260 बार थी ):
इस बिंदु पर, पृष्ठ पर सटीक समान डेटा की दो प्रतियां हैं। "पुराना" कॉलम अनिवार्य रूप से हटा दिया गया है (आईडी आईडी = 2 से आईडी = 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% ड्रॉप)
जैसा कि आप देख सकते हैं, डेटा फ़ाइल राइट्स में थोड़ी सी गिरावट थी, और लॉग फ़ाइल में एक बड़ी गिरावट लिखती है।