मैं SQL डेटाबेस में कुछ परीक्षण चला रहा था और कम से कम एक नया ऑपरेशन खोजा जो ONLINE = ON
का समर्थन करता है . यह बिल्कुल हाल के संस्करण पर है, वैसे - SELECT @@VERSION;
एक पुराना बिल्ड नंबर देना जारी रखता है, लेकिन सबूत निर्माण की तारीख में है:
फ़रवरी 12 2015 00:53:13
कॉपीराइट (c) Microsoft Corporation
Azure SQL डेटाबेस का यह संस्करण ONLINE = ON
. का समर्थन करता है ALTER TABLE ... ALTER COLUMN
. के लिए विकल्प ।
मान लें कि आपके पास एक अशक्त स्तंभ वाली तालिका है:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;
और अब आप उस कॉलम को अशक्त नहीं बनाने का निर्णय लेते हैं, आप यह कर सकते हैं (यह मानते हुए कि कोई NULL
नहीं है। रों):
ALTER TABLE dbo.a ALTER COLUMN x VARCHAR(255) NOT NULL WITH (ONLINE = ON);
आप कॉलेशन, डेटा प्रकार या कॉलम का आकार बदलने जैसे काम भी कर सकते हैं:
ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) -- changed data type and length COLLATE Albanian_BIN NOT NULL -- changed collation and nullability WITH (ONLINE = ON);
SQL सर्वर (और Azure SQL डेटाबेस के पिछले संस्करणों) के वर्तमान संस्करणों में, ONLINE = ON
ALTER TABLE
. के लिए संकेत समर्थित नहीं था , और विकल्प के बिना, यह एक अवरोधन और आकार का डेटा ऑपरेशन था। निष्पक्ष होने के लिए, पहली बार जब मैंने कोड चलाया, तो मैं केवल यह साबित कर सका कि ONLINE = ON
वाला संस्करण सफलतापूर्वक चला, ऐसा नहीं है कि यह विज्ञापित के रूप में काम करता है।
मैंने इस कोड को ONLINE = ON
के साथ चलाया था और बिना:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects; -- placeholder; ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) COLLATE Albanian_BIN NOT NULL -- WITH (ONLINE = ON); -- placeholder; DROP TABLE dbo.a;
--placeholder
में स्पॉट, मैंने व्यवहार में किसी भी अंतर को निर्धारित करने के लिए कुछ चीजों की कोशिश की (यह हमारा उत्पादन SQL डेटाबेस था, इसलिए मैं पर्याप्त डेटा का उपयोग नहीं करना चाहता था या पर्याप्त गतिविधि नहीं बनाना चाहता था कि अंतर स्पष्ट होगा)। मैं दोनों परिदृश्यों में जांचना चाहता था कि क्या पृष्ठ बदल गया है (एक सच्चे ऑनलाइन संचालन का संकेत देता है) या यदि मौजूदा पृष्ठों पर मूल्यों को अद्यतन किया गया था (एक गैर-ऑनलाइन ऑपरेशन)। मैं यह देखने के लिए परीक्षण का विस्तार भी कर सकता था कि यदि पृष्ठ भरे हुए थे और/या सभी 255 वर्णों का उपयोग किया गया था, तो कितने नए पृष्ठ बनाए गए थे, लेकिन मैंने सोचा कि केवल यह देखना पर्याप्त होगा कि पृष्ठ बदल गए हैं या नहीं।
मैंने कोशिश की DBCC IND()
:
DBCC IND(N'dbname', N'dbo.a', 1, 1);
यहां परिणाम आश्चर्यजनक नहीं थे:
Msg 40518, स्तर 16, राज्य 1DBCC कमांड 'IND' SQL सर्वर के इस संस्करण में समर्थित नहीं है।
और sys.dm_db_database_page_allocations
(DBCC IND
का प्रतिस्थापन ):
SELECT allocated_page_page_id FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(N'dbo.a'),1,1,N'LIMITED') WHERE is_iam_page = 0;
इसने एक खाली परिणाम सेट प्राप्त किया - मेरा मानना है कि यह डिज़ाइन द्वारा है कि यह गतिशील प्रबंधन फ़ंक्शन Azure SQL डेटाबेस में किसी भी भौतिक जानकारी को उजागर नहीं करता है।
इसके बाद, मैंने fn_PhysLocCracker
. के साथ एक ट्रिक आजमाई , मिशेल उफ़र्ड (@sqlfool) जैसे लोगों ने पहले किस बारे में ब्लॉग किया है:
SELECT l.page_id FROM dbo.a OUTER APPLY sys.fn_PhysLocCracker(%%PhysLoc%%) AS l;
सफलता! यह dbo.a
. के विरुद्ध स्कैन में उपयोग किए गए पृष्ठों के लिए मान लौटाता है , और यह स्पष्ट है कि ONLINE = ON
. में संस्करण, डेटा को नए पृष्ठों पर ले जाया जाता है (संभवतः पूरे ऑपरेशन में उपलब्ध पुराने को छोड़कर), और संकेत के बिना, डेटा और मेटाडेटा को जगह में अपडेट किया जाता है:
मानक ALTER COLUMN व्यवहार (बाएं) के तहत ONLINE =ON (दाएं) के साथ पृष्ठों की तुलना करना
एक और चीज जिसकी मैं तुलना करना चाहता था वह थी निष्पादन योजनाएं। मैं प्रबंधन स्टूडियो में बहुत कुछ नहीं देख सकता, लेकिन SQL संतरी योजना एक्सप्लोरर प्रो में, मैं पूर्ण कॉल स्टैक देख सकता हूं, जिसमें कुछ डीडीएल कमांड के दृश्यों के पीछे क्या होता है। हमारे टूल ने निराश नहीं किया - हालांकि इसने इन-प्लेस अपडेट विविधता के लिए एक वास्तविक योजना प्रस्तुत नहीं की, यह भी दर्शाता है कि ONLINE = ON
का उपयोग करते समय एक महत्वपूर्ण व्यवहार अंतर होता है। :
ऑनलाइन =ON (दाएं) के साथ मानक ALTER COLUMN व्यवहार (बाएं) के तहत योजनाओं की तुलना करना
बेशक, आपको यह अंतर केवल तभी दिखाई देगा जब आप हाल ही में अपडेट किए गए दस्तावेज़ों में ऑनलाइन संचालन के लिए आवश्यक अन्य सभी शर्तों को पूरा करते हैं (कई ऑनलाइन इंडेक्स पुनर्निर्माण के लिए आवश्यकताओं के समान हैं)।
अब, यदि आप SQL डेटाबेस का उपयोग नहीं कर रहे हैं, तो यह आपकी कैसे मदद करता है? आखिरकार, यह सिंटैक्स SQL सर्वर 2014 संचयी अद्यतन #6 (12.0.2480) में भी सही ढंग से पार्स नहीं करता है। ठीक है, Microsoft वास्तव में इस तथ्य की रखवाली नहीं कर रहा है कि विकास पैटर्न "क्लाउड पहले, फिर बॉक्स" बन गया है - जैसा कि मार्क सूजा ने हाल ही में निहित किया था जब उन्होंने पहली बार Azure SQL डेटाबेस में पेश की गई नई पंक्ति-स्तरीय सुरक्षा सुविधा के बारे में ट्वीट किया था:
पंक्ति स्तर की सुरक्षा। #sqlserver समुदाय ने बहुत कुछ मांगा। http://t.co/pp0sNr8Nt5 क्लाउड पहले लेकिन आप इसका मतलब जानते हैं। यह आ रहा है
- मार्क सूजा (@mark_AzureCAT) 8 फरवरी, 2015
इसका मतलब यह है कि ये ऑनलाइन संचालन संभवत:जल्द ही किसी बिंदु पर SQL सर्वर की आपकी स्थानीय प्रतिलिपि पर भी आ रहे हैं। हालांकि, कई अन्य ऑनलाइन संचालनों की तरह, ध्यान रखें कि ये चीज़ें एंटरप्राइज़ संस्करण के लिए आरक्षित होती हैं।