SQL सर्वर 2014 के लिए सर्विस पैक 2 पिछले महीने जारी किया गया था (रिलीज़ नोट यहाँ पढ़ें) और इसमें एक नया DBCC स्टेटमेंट शामिल है:DBCC CLONEDATABASE
. मैं इस आदेश को पेश करते हुए देखकर बहुत उत्साहित था, क्योंकि यह एक बहुत आसान . प्रदान करता है डेटाबेस स्कीमा को कॉपी करने का तरीका, आँकड़ों सहित , जिसका उपयोग डेटाबेस में डेटा के लिए आवश्यक सभी स्थान की आवश्यकता के बिना क्वेरी प्रदर्शन के परीक्षण के लिए किया जा सकता है। मैंने अंततः DBCC CLONEDATABASE
. का परीक्षण करने के लिए कुछ समय दिया और सीमाओं को समझें, और मुझे कहना होगा कि यह काफी मजेदार था।
मूल बातें
मैंने एडवेंचरवर्क्स2014 डेटाबेस का क्लोन बनाकर और सोर्स डेटाबेस और फिर क्लोन डेटाबेस के खिलाफ एक क्वेरी चलाकर शुरुआत की:
DBCC CLONEDATABASE (N'AdventureWorks2014', N'AdventureWorks2014_CLONE'); GO SET STATISTICS IO ON; GO SET STATISTICS TIME ON; GO SET STATISTICS XML ON; GO USE [AdventureWorks2014]; GO SELECT * FROM [Sales].[SalesOrderHeader] [h] JOIN [Sales].[SalesOrderDetail] [d] ON [h].[SalesOrderID] = [d].[SalesOrderID] ORDER BY [SalesOrderDetailID]; GO USE [AdventureWorks2014_CLONE]; GO SELECT * FROM [Sales].[SalesOrderHeader] [h] JOIN [Sales].[SalesOrderDetail] [d] ON [h].[SalesOrderID] = [d].[SalesOrderID] ORDER BY [SalesOrderDetailID]; GO SET STATISTICS IO OFF; GO SET STATISTICS TIME OFF; GO SET STATISTICS XML OFF; GO
यदि मैं I/O और TIME आउटपुट को देखता हूं, तो मैं देख सकता हूं कि स्रोत डेटाबेस के विरुद्ध क्वेरी में अधिक समय लगा और बहुत अधिक I/O उत्पन्न हुआ, दोनों की अपेक्षा की जाती है क्योंकि क्लोन डेटाबेस में कोई डेटा नहीं है:पी>
/* स्रोत डेटाबेस */
SQL सर्वर निष्पादन समय:
CPU समय =0 ms, बीता हुआ समय =0 ms.
SQL सर्वर पार्स और संकलन समय:
CPU समय =0 ms, बीता हुआ समय =4 ms.
(121317 पंक्ति(पंक्तियां) प्रभावित)
टेबल 'सेल्स ऑर्डर हैडर'। स्कैन काउंट 0, लॉजिकल रीड्स 371567, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
टेबल 'वर्कटेबल'। स्कैन काउंट 0, लॉजिकल रीड्स 0, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-फॉरवर्ड रीड्स 0।
तालिका 'बिक्री आदेश विवरण'। स्कैन काउंट 5, लॉजिकल रीड्स 1361, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
टेबल 'वर्कटेबल'। स्कैन काउंट 0, लॉजिकल रीड्स 0, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-फॉरवर्ड रीड्स 0।
(1 पंक्ति(पंक्ति) प्रभावित)
SQL सर्वर निष्पादन समय:
CPU समय =686 ms, बीता हुआ समय =2548 ms.
/* क्लोन डेटाबेस */
SQL सर्वर निष्पादन समय:
CPU समय =0 ms, बीता हुआ समय =0 ms.
SQL सर्वर पार्स और संकलन समय:
CPU समय =12 ms, बीता हुआ समय =12 ms.
(0 पंक्तियाँ प्रभावित)
टेबल 'वर्कटेबल'। स्कैन काउंट 0, लॉजिकल रीड्स 0, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-फॉरवर्ड रीड्स 0।
तालिका 'बिक्री ऑर्डर हैडर'। स्कैन काउंट 0, लॉजिकल रीड्स 0, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-फॉरवर्ड रीड्स 0।
तालिका 'बिक्री आदेश विवरण'। स्कैन काउंट 5, लॉजिकल रीड्स 0, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
(1 पंक्ति(पंक्ति) प्रभावित)
SQL सर्वर निष्पादन समय:
CPU समय =0 ms, बीता हुआ समय =83 ms.
यदि मैं निष्पादन योजनाओं को देखता हूं, तो वे वास्तविक मूल्यों को छोड़कर दोनों डेटाबेस के लिए समान हैं (डेटा की मात्रा जो वास्तव में योजना के माध्यम से स्थानांतरित की गई है):
AdventureWorks2014 डेटाबेस के लिए क्वेरी प्लान
AdventureWorks2014_CLONE डेटाबेस के लिए क्वेरी प्लान
यहीं पर DBCC CLONEDATABASE
. का मान होता है स्पष्ट है - मैं किसी को भी डेटाबेस की एक खाली प्रति प्राप्त कर सकता हूं (Microsoft उत्पाद समर्थन, मेरे साथी DBA, आदि) और उनसे किसी समस्या को फिर से बनाने और उसकी जांच करने के लिए कह सकता हूं, और उन्हें संभावित रूप से सैकड़ों GB डिस्क स्थान की आवश्यकता नहीं है। यह। मेलिसा की जुलाई टी-एसक्यूएल मंगलवार की पोस्ट में विस्तृत जानकारी है कि क्लोन प्रक्रिया के दौरान क्या होता है, इसलिए मैं अधिक जानकारी के लिए इसे पढ़ने की सलाह देता हूं।
क्या ऐसा है?
लेकिन... क्या मैं DBCC CLONEDATABASE
. के साथ और अधिक कर सकता हूं? ? मेरा मतलब है, यह बहुत अच्छा है, लेकिन मुझे लगता है कि डेटाबेस की एक खाली प्रति के साथ मैं कई अन्य चीजें कर सकता हूं। यदि आप DBCC CLONEDATABASE
. के लिए दस्तावेज़ पढ़ते हैं , आपको यह लाइन दिखाई देगी:
मेरा पहला विचार था, "क्वेरी ऑप्टिमाइज़र - हम्म ... क्या मैं इसे अपग्रेड के परीक्षण के लिए एक विकल्प के रूप में उपयोग कर सकता हूं ?"
ठीक है, क्लोन किया गया डेटाबेस केवल पढ़ने के लिए है, लेकिन मैंने सोचा कि मैं वैसे भी कुछ विकल्पों को बदलने की कोशिश करूंगा। उदाहरण के लिए, अगर मैं संगतता मोड बदल सकता हूं, तो यह वास्तव में अच्छा होगा, क्योंकि तब मैं SQL सर्वर 2014 और SQL सर्वर 2016 दोनों में CE परिवर्तनों का परीक्षण कर सकता था।
USE [master]; GO ALTER DATABASE [AdventureWorks2014_CLONE] SET COMPATIBILITY_LEVEL = 110;
मुझे एक त्रुटि मिलती है:
Msg 3906, Level 16, State 1डेटाबेस "AdventureWorks2014_CLONE" को अपडेट करने में विफल रहा क्योंकि डेटाबेस केवल पढ़ने के लिए है।
Msg 5069, Level 16, State 1
ALTER DATABASE स्टेटमेंट विफल।
हम्म। क्या मैं पुनर्प्राप्ति मॉडल बदल सकता हूं?
ALTER DATABASE [AdventureWorks2014_CLONE] SET RECOVERY SIMPLE WITH NO_WAIT;
हाँ मैं। यह उचित नहीं लगता। खैर, यह केवल पढ़ने के लिए है, क्या मैं इसे बदल सकता हूँ?
ALTER DATABASE [AdventureWorks2014_CLONE] SET READ_WRITE WITH NO_WAIT;
हां! इससे पहले कि आप बहुत उत्साहित हों, मुझे इस नोट को दस्तावेज़ीकरण से यहीं छोड़ देना चाहिए:
नोट DBCC CLONEDATABASE से उत्पन्न नया जनरेट किया गया डेटाबेस उत्पादन डेटाबेस के रूप में उपयोग करने के लिए समर्थित नहीं है और मुख्य रूप से समस्या निवारण और नैदानिक उद्देश्यों के लिए अभिप्रेत है। हम डेटाबेस बनाने के बाद क्लोन किए गए डेटाबेस को अलग करने की सलाह देते हैं।मैं दस्तावेज़ीकरण से इस पंक्ति को दोहराने जा रहा हूं, और इसे बोल्ड कर दूंगा और इसे एक दोस्ताना लेकिन अत्यंत महत्वपूर्ण के रूप में लाल रंग में डालूंगा अनुस्मारक:
DBCC CLONEDATABASE से उत्पन्न नया जनरेट किया गया डेटाबेस उत्पादन डेटाबेस के रूप में उपयोग करने के लिए समर्थित नहीं है और प्राथमिक रूप से समस्या निवारण और नैदानिक उद्देश्यों के लिए अभिप्रेत है।खैर यह मेरे साथ ठीक है, मैं निश्चित रूप से इसे उत्पादन के लिए उपयोग नहीं करने जा रहा था, लेकिन अब मैं इसे परीक्षण के लिए उपयोग कर सकता हूं! अब मैं संगतता मोड बदल सकता हूं, और अब मैं इसका बैक अप ले सकता हूं और परीक्षण के लिए इसे किसी अन्य उदाहरण पर पुनर्स्थापित कर सकता हूं!
USE [master]; GO BACKUP DATABASE [AdventureWorks2014_CLONE] TO DISK = N'C:\Backups\AdventureWorks2014_CLONE.bak' WITH INIT, NOFORMAT, STATS = 10, NAME = N'AW2014_CLONE_full'; GO /* restore on SQL Server 2016 */ RESTORE DATABASE [AdventureWorks2014_CLONE] FROM DISK = N'C:\Backups\AdventureWorks2014_CLONE.bak' WITH MOVE N'AdventureWorks2014_Data' TO N'C:\Databases\AdventureWorks2014_Data_2684624044.mdf', MOVE N'AdventureWorks2014_Log' TO N'C:\Databases\AdventureWorks2014_Log_3195542593.ldf', NOUNLOAD, REPLACE, STATS = 5; GO ALTER DATABASE [AdventureWorks2014_CLONE] SET COMPATIBILITY_LEVEL = 130; GO
यह बहुत बड़ा है।
अपनी पिछली पोस्ट में मैंने ट्रेस फ्लैग 2389 और नए कार्डिनैलिटी एस्टीमेटर के साथ परीक्षण के बारे में बात की थी क्योंकि, दोस्तों, आपको जरूरत अपग्रेड करने से पहले नए सीई के साथ परीक्षण करने के लिए। यदि आप परीक्षण नहीं करते हैं, और यदि आप अपने अपग्रेड के हिस्से के रूप में संगतता मोड को 120 (एसक्यूएल सर्वर 2014) या 130 (एसक्यूएल सर्वर 2016) में बदलते हैं, तो आप फायर-फाइटिंग मोड में काम करने का जोखिम चलाते हैं। नए सीई के साथ प्रतिगमन। अब, आप ठीक हो सकते हैं, और अपग्रेड करने के बाद प्रदर्शन और भी बेहतर हो सकता है। लेकिन... क्या आप निश्चित नहीं होना चाहेंगे?
बहुत बार जब मैं अपग्रेड से पहले परीक्षण का उल्लेख करता हूं, तो मुझे बताया जाता है कि परीक्षण करने के लिए कोई वातावरण नहीं है। मुझे पता है कि आप में से कुछ के पास टेस्ट का माहौल है। आप में से कुछ के पास टेस्ट, देव, क्यूए, यूएटी है और कौन जानता है कि और क्या है। आप भाग्यशाली हैं।
आप में से उन लोगों के लिए जो आपके पास परीक्षण करने के लिए कोई परीक्षण वातावरण नहीं है, मैं आपको DBCC CLONEDATABASE
देता हूं। . इस आदेश के साथ, आपके पास अपने डेटाबेस के क्लोन के खिलाफ सबसे अधिक बार निष्पादित प्रश्नों और भारी-हिटर्स को नहीं चलाने का कोई बहाना नहीं है। भले ही आपके पास परीक्षण वातावरण न हो, आपके पास अपनी मशीन है। उत्पादन से क्लोन डेटाबेस का बैकअप लें, क्लोन छोड़ें, बैकअप को अपने स्थानीय उदाहरण में पुनर्स्थापित करें, और फिर परीक्षण करें। क्लोन डेटाबेस डिस्क पर बहुत कम जगह लेता है और आपको मेमोरी या I/O विवाद नहीं होगा क्योंकि कोई डेटा नहीं है। आप करेंगे अपने उत्पादन डेटाबेस से क्लोन से क्वेरी योजनाओं को मान्य करने में सक्षम हो। इसके अलावा, यदि आप SQL सर्वर 2016 पर पुनर्स्थापित करते हैं तो आप अपने परीक्षण में क्वेरी स्टोर को शामिल कर सकते हैं! क्वेरी स्टोर सक्षम करें, मूल संगतता मोड में अपने परीक्षण के माध्यम से चलाएं, फिर संगतता मोड को अपग्रेड करें और फिर से परीक्षण करें। आप क्वेरी स्टोर का उपयोग साथ-साथ क्वेरीज़ की तुलना करने के लिए कर सकते हैं! (क्या आप बता सकते हैं कि मैं अभी अपनी कुर्सी पर नाच रहा हूँ?)
विचारों
दोबारा, यह ऐसा कुछ भी नहीं होना चाहिए जिसका आप उत्पादन में उपयोग करेंगे, और मुझे पता है कि आप ऐसा नहीं करेंगे, लेकिन यह दोहराता है क्योंकि इसकी वर्तमान स्थिति में, DBCC CLONEDATABASE
पूरी तरह से पूर्ण नहीं है . यह समर्थित ऑब्जेक्ट के अंतर्गत KB आलेख में नोट किया गया है; स्मृति अनुकूलित तालिकाओं और फ़ाइल तालिकाओं जैसी वस्तुओं की प्रतिलिपि नहीं बनाई जाती है, पूर्ण-पाठ समर्थित नहीं है, आदि।
अब, क्लोन डेटाबेस कमियों के बिना नहीं है। यदि आप अनजाने में एक इंडेक्स पुनर्निर्माण या उस डेटाबेस में आंकड़ों के लिए एक अद्यतन चलाते हैं, तो आपने अपना परीक्षण डेटा मिटा दिया है। आप मूल आँकड़ों को खो देंगे जो शायद आप वास्तव में पहले स्थान पर चाहते थे। उदाहरण के लिए, यदि मैं अभी SalesOrderHeader पर संकुल अनुक्रमणिका के आँकड़ों की जाँच करता हूँ, तो मुझे यह मिलता है:
USE [AdventureWorks2014_CLONE]; GO DBCC SHOW_STATISTICS (N'Sales.SalesOrderHeader',PK_SalesOrderHeader_SalesOrderID);
SalesOrderHeader के लिए मूल आंकड़े
अब, अगर मैं उस तालिका के लिए आंकड़े अपडेट करता हूं, तो मुझे यह मिलता है:
UPDATE STATISTICS [Sales].[SalesOrderHeader] WITH FULLSCAN; GO DBCC SHOW_STATISTICS (N'Sales.SalesOrderHeader',PK_SalesOrderHeader_SalesOrderID);
SalesOrderHeader के लिए अद्यतन (खाली) आँकड़े
अतिरिक्त सुरक्षा के रूप में, आंकड़ों में स्वतः अपडेट अक्षम करना शायद एक अच्छा विचार है:
USE [master]; GO ALTER DATABASE [AdventureWorks2014_CLONE] SET AUTO_UPDATE_STATISTICS OFF WITH NO_WAIT;
यदि आप अनजाने में आंकड़े अपडेट करते हैं, तो DBCC CLONEDATABASE
चला रहे हैं और बैकअप और पुनर्स्थापना प्रक्रिया से गुजरना इतना कठिन नहीं है, और आप इसे कुछ ही समय में स्वचालित कर देंगे।
आप डेटाबेस में डेटा जोड़ सकते हैं। यह उपयोगी हो सकता है यदि आप आंकड़ों के साथ प्रयोग करना चाहते हैं (उदाहरण के लिए विभिन्न नमूना दरें, फ़िल्टर किए गए आंकड़े) और आपके पास तालिका के डेटा की एक प्रति रखने के लिए पर्याप्त संग्रहण है।
डेटाबेस में कोई डेटा नहीं होने के कारण, आपको स्पष्ट रूप से प्रतिनिधि अवधि और I/O डेटा नहीं मिलेगा। ठीक है। यदि आपको वास्तविक संसाधन उपयोग के बारे में डेटा की आवश्यकता है, तो आपको अपने डेटाबेस की एक प्रति की आवश्यकता है जिसमें सभी डेटा हों। DBCC CLONEDATABASE
वास्तव में क्वेरी प्रदर्शन का परीक्षण करने के बारे में है; यह बात है। यह किसी भी तरह से पारंपरिक अपग्रेड परीक्षण के लिए एक प्रतिस्थापन नहीं है - लेकिन यह सत्यापित करने के लिए एक नया विकल्प है कि SQL सर्वर विभिन्न संस्करणों और संगतता मोड के साथ क्वेरी को कैसे अनुकूलित करता है। हैप्पी टेस्टिंग!