Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

अंतर जानने के लिए लिनक्स बनाम विंडोज परफॉर्मेंस टेस्ट पर एमएस एसक्यूएल सर्वर

Linux के लिए SQL Server 2017 जारी होने के बाद से, Microsoft ने पूरे गेम को काफी हद तक बदल दिया है। इसने उनके प्रसिद्ध रिलेशनल डेटाबेस के लिए संभावनाओं की एक पूरी नई दुनिया को सक्षम किया, जो उस समय तक केवल विंडोज स्पेस में उपलब्ध था।

मुझे पता है कि एक शुद्ध डीबीए मुझे तुरंत बताएगा कि बॉक्स के बाहर SQL सर्वर 2019 लिनक्स संस्करण में इसके विंडोज समकक्ष के संबंध में, सुविधाओं के संदर्भ में कई अंतर हैं, जैसे:

  • कोई SQL सर्वर एजेंट नहीं
  • कोई फ़ाइल स्ट्रीम नहीं
  • कोई सिस्टम विस्तारित संग्रहीत कार्यविधियाँ नहीं (जैसे xp_cmdshell)

हालांकि, मैं यह सोचने के लिए काफी उत्सुक था कि "क्या होगा यदि उनकी तुलना कम से कम कुछ हद तक, उन चीजों के खिलाफ की जा सकती है जो दोनों कर सकते हैं?" इसलिए, मैंने कुछ वीएम पर ट्रिगर खींचा, कुछ सरल परीक्षण तैयार किए, और आपके सामने प्रस्तुत करने के लिए डेटा एकत्र किया। आइए देखें कि चीजें कैसी होती हैं!

प्रारंभिक विचार

यहां प्रत्येक VM के विनिर्देश दिए गए हैं:

  • विंडोज
    • विंडोज 10 ओएस
    • 4 वीसीपीयू
    • 4 जीबी रैम
    • 30 जीबी एसएसडी
  • लिनक्स
    • उबंटू सर्वर 20.04 एलटीएस
    • 4 वीसीपीयू
    • 4 जीबी रैम
    • 30 जीबी एसएसडी

SQL सर्वर संस्करण के लिए, मैंने दोनों ऑपरेटिंग सिस्टमों के लिए सबसे नवीनतम को चुना:SQL Server 2019 डेवलपर संस्करण CU10

प्रत्येक परिनियोजन में, केवल एक चीज सक्षम थी त्वरित फ़ाइल आरंभीकरण (लिनक्स पर डिफ़ॉल्ट रूप से सक्षम, विंडोज़ पर मैन्युअल रूप से सक्षम)। इसके अलावा, बाकी सेटिंग्स के लिए डिफ़ॉल्ट मान बने रहे।

  • विंडोज़ में, आप इंस्टालेशन विजार्ड के साथ इंस्टेंट फाइल इनिशियलाइज़ेशन को सक्षम करना चुन सकते हैं।

यह पोस्ट लिनक्स में इंस्टेंट फाइल इनिशियलाइज़ेशन कार्य की विशिष्टता को कवर नहीं करेगा। हालाँकि, मैं आपको समर्पित लेख का एक लिंक छोड़ दूँगा जिसे आप बाद में पढ़ सकते हैं (ध्यान दें कि यह तकनीकी पक्ष पर थोड़ा भारी हो जाता है)।

परीक्षा में क्या शामिल है?

  1. प्रत्येक SQL सर्वर 2019 उदाहरण में, मैंने एक परीक्षण डेटाबेस परिनियोजित किया और केवल एक फ़ील्ड (एक NVARCHAR(MAX)) के साथ एक तालिका बनाई।
  2. 1,000,000 वर्णों की एक यादृच्छिक रूप से उत्पन्न स्ट्रिंग का उपयोग करते हुए, मैंने निम्नलिखित चरणों का पालन किया:
    • *परीक्षण तालिका में पंक्तियों की X संख्या डालें।
    • मापें कि INSERT कथन को पूरा करने में कितना समय लगा।
    • एमडीएफ और एलडीएफ फाइलों के आकार को मापें।
    • परीक्षण तालिका में सभी पंक्तियां हटाएं।
    • ** मापें कि DELETE कथन को पूरा करने में कितना समय लगा।
    • एलडीएफ फ़ाइल का आकार मापें।
    • परीक्षण डेटाबेस छोड़ें।
    • फिर से परीक्षण डेटाबेस बनाएं।
    • एक ही चक्र दोहराएं।

*X 1,000, 5,000, 10,000, 25,000 और 50,000 पंक्तियों के लिए किया गया था।

**मुझे पता है कि एक TRUNCATE कथन अधिक कुशलता से काम करता है, लेकिन यहाँ मेरा कहना यह साबित करना है कि प्रत्येक OS में डिलीट ऑपरेशन के लिए प्रत्येक लेनदेन लॉग को कितनी अच्छी तरह से प्रबंधित किया जाता है।

यदि आप गहराई में जाना चाहते हैं तो आप उस वेबसाइट पर जा सकते हैं जिसका उपयोग मैंने यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए किया था।

प्रत्येक ऑपरेटिंग सिस्टम में परीक्षण के लिए उपयोग किए गए TSQL कोड के अनुभाग यहां दिए गए हैं:

लिनक्स TSQL कोड

डेटाबेस और तालिका निर्माण

DROP DATABASE IF EXISTS test
CREATE DATABASE test
    ON
(FILENAME= '/var/opt/mssql/data/test.mdf', NAME = test, FILEGROWTH = 128MB)
LOG ON
(FILENAME= '/var/opt/mssql/data/test_log.ldf',NAME = test_log, FILEGROWTH = 64MB);

CREATE TABLE test.dbo.ubuntu(
    long_string NVARCHAR(MAX) NOT NULL
)

परीक्षण डेटाबेस के लिए MDF और LDF फ़ाइलों का आकार

SELECT 
        DB_NAME(database_id) AS 'DB',
        type_desc AS 'Type',
        state_desc AS 'State',
        CONVERT(DECIMAL(10,2),size*8/1024) AS 'Size',
        CONVERT(DECIMAL(10,2),growth*8/1024) AS 'Growth'
FROM    sys.master_files
WHERE   DB_NAME(database_id) = 'test'

नीचे दिया गया स्क्रीनशॉट डेटा फ़ाइलों के आकार दिखाता है जब डेटाबेस में कुछ भी संग्रहीत नहीं होता है:

यह निर्धारित करने के लिए प्रश्न कि तत्काल फ़ाइल आरंभीकरण सक्षम है या नहीं

SELECT 
       servicename,
       instant_file_initialization_enabled
FROM   sys.dm_server_services
WHERE  servicename = 'SQL Server (MSSQLSERVER)'

Windows TSQL कोड

डेटाबेस और तालिका निर्माण

DROP DATABASE IF EXISTS test
CREATE DATABASE test
    ON
(FILENAME= 'S:\Program Files\Microsoft SQL Server\MSSQL15.WINDOWS\MSSQL\DATA\test.mdf', NAME = test, FILEGROWTH = 128MB)
LOG ON
(FILENAME= ''S:\Program Files\Microsoft SQL Server\MSSQL15.WINDOWS\MSSQL\DATA\test_log.ldf',NAME = test_log, FILEGROWTH = 64MB);

CREATE TABLE test.dbo.windows(
    long_string NVARCHAR(MAX) NOT NULL
)

परीक्षण डेटाबेस के लिए MDF और LDF फ़ाइलों का आकार

SELECT 
        DB_NAME(database_id) AS 'DB',
        type_desc AS 'Type',
        state_desc AS 'State',
        CONVERT(DECIMAL(10,2),size*8/1024) AS 'Size',
        CONVERT(DECIMAL(10,2),growth*8/1024) AS 'Growth'
FROM    sys.master_files
WHERE   DB_NAME(database_id) = 'test'

निम्न स्क्रीनशॉट डेटा फ़ाइलों के आकार दिखाता है जब डेटाबेस में कुछ भी संग्रहीत नहीं होता है:

यह निर्धारित करने के लिए क्वेरी कि क्या त्वरित फ़ाइल आरंभीकरण सक्षम है

SELECT 
       servicename,
       instant_file_initialization_enabled
FROM   sys.dm_server_services
WHERE  servicename = 'SQL Server (MSSQLSERVER)'

INSERT कथन निष्पादित करने के लिए स्क्रिप्ट:

@limit -> यहाँ मैंने परीक्षण तालिका में सम्मिलित करने के लिए पंक्तियों की संख्या निर्दिष्ट की है

लिनक्स के लिए, चूंकि मैंने SQLCMD का उपयोग करके स्क्रिप्ट को निष्पादित किया है, इसलिए मैंने DATEDIFF फ़ंक्शन को बहुत अंत में रखा है। यह मुझे बताता है कि पूरे निष्पादन में कितने सेकंड लगते हैं (विंडोज संस्करण के लिए, मैं बस SQL ​​सर्वर प्रबंधन स्टूडियो में टाइमर पर एक झलक ले सकता था)।

संपूर्ण 1,000,000 वर्णों की स्ट्रिंग 'XXXX' के बजाय जाती है। इस पोस्ट में इसे अच्छी तरह से प्रस्तुत करने के लिए ही मैं इसे ऐसे ही डाल रहा हूँ।

SET NOCOUNT ON
GO
DECLARE @StartTime DATETIME;
DECLARE @i INT;
DECLARE @limit INT;
SET @StartTime = GETDATE();
SET @i = 0;
SET @limit = 1000;

WHILE(@i < @limit)
BEGIN
	INSERT INTO test.dbo.ubuntu VALUES('XXXX');
	SET @i = @i + 1
END

SELECT DATEDIFF(SECOND,@StartTime,GETDATE()) AS 'Elapsed Seconds';

DELETE कथन निष्पादित करने के लिए स्क्रिप्ट

SET NOCOUNT ON
GO
DECLARE @StartTime DATETIME;
SET @StartTime = GETDATE();

DELETE FROM test.dbo.ubuntu;

SELECT DATEDIFF(SECOND,@StartTime,GETDATE()) AS 'Elapsed Seconds';

प्राप्त परिणाम

सभी आकार एमबी में व्यक्त किए जाते हैं। सभी समय माप सेकंडों में व्यक्त किए जाते हैं।

समय डालें 1,000 रिकॉर्ड 5,000 रिकॉर्ड 10,000 रिकॉर्ड 25,000 रिकॉर्ड 50,000 रिकॉर्ड
लिनक्स 4 23 43 104 212
विंडोज 4 28 172 531 186
आकार (MDF) 1,000 रिकॉर्ड 5,000 रिकॉर्ड 10,000 रिकॉर्ड 25,000 रिकॉर्ड 50,000 रिकॉर्ड
लिनक्स 264 1032 2056 5128 10184
विंडोज 264 1032 2056 5128 10248
आकार (LDF) 1,000 रिकॉर्ड 5,000 रिकॉर्ड 10,000 रिकॉर्ड 25,000 रिकॉर्ड 50,000 रिकॉर्ड
लिनक्स 104 264 360 552 148
विंडोज 136 328 392 456 584
समय हटाएं 1,000 रिकॉर्ड 5,000 रिकॉर्ड 10,000 रिकॉर्ड 25,000 रिकॉर्ड 50,000 रिकॉर्ड
लिनक्स 1 1 74 215 469
विंडोज 1 63 126 357 396
आकार हटाएं (LDF) 1,000 रिकॉर्ड 5,000 रिकॉर्ड 10,000 रिकॉर्ड 25,000 रिकॉर्ड 50,000 रिकॉर्ड
लिनक्स 136 264 392 584 680
विंडोज 200 328 392 456 712

मुख्य जानकारी

  • एमडीएफ का आकार पूरे परीक्षण में काफी सुसंगत था, बहुत अंत में थोड़ा अलग था (लेकिन कुछ भी पागल नहीं था)।
  • इंसर्ट का समय अधिकांश भाग के लिए लिनक्स में बेहतर था, केवल उस अंत को छोड़कर जब विंडोज ने "राउंड जीता"।
  • INSERTs के प्रत्येक दौर के बाद लेन-देन लॉग फ़ाइल का आकार Linux में बेहतर ढंग से संभाला गया था।
  • लिनक्स में DELETEs का समय अधिकांश भाग के लिए बेहतर था, केवल उस छोर को छोड़कर जहां विंडोज ने "राउंड जीता" (मुझे यह उत्सुक लगता है कि विंडोज ने अंतिम INSERT राउंड भी जीता)।
  • DELETEs के प्रत्येक दौर के बाद लेन-देन लॉग फ़ाइलों का आकार दोनों के बीच उतार-चढ़ाव के मामले में काफी हद तक एक टाई था।
  • मैं 100,000 पंक्तियों के साथ परीक्षण करना पसंद करता, लेकिन मेरे पास डिस्क स्थान की थोड़ी कमी थी, इसलिए मैंने इसे 50,000 पर सीमित कर दिया।

निष्कर्ष

इस परीक्षण से प्राप्त परिणामों के आधार पर, मैं कहूंगा कि यह दावा करने का कोई मजबूत कारण नहीं है कि लिनक्स संस्करण अपने विंडोज समकक्ष की तुलना में तेजी से बेहतर प्रदर्शन करता है। बेशक, यह किसी भी तरह से औपचारिक परीक्षा नहीं है जिसे आप इस तरह का निर्णय लेने के लिए आधार बना सकते हैं। हालांकि, अभ्यास ही मेरे लिए काफी दिलचस्प था।

मुझे लगता है कि विंडोज के लिए SQL सर्वर 2019 कभी-कभी बैकग्राउंड में GUI रेंडरिंग के कारण थोड़ा पीछे (ज्यादा नहीं) हो जाता है, जो कि बाड़ के उबंटू सर्वर साइड में नहीं हो रहा है।

यदि आप विंडोज़ के लिए विशिष्ट सुविधाओं और क्षमताओं पर बहुत अधिक भरोसा करते हैं (कम से कम इस लेखन के समय), तो हर तरह से इसके लिए जाएं। अन्यथा, आप एक के बाद एक करके शायद ही कोई गलत चुनाव करेंगे।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में परिणाम सेट में लौटाए गए कॉलम के डेटा प्रकार का पता लगाएं

  2. क्या मैं जावा ईई वेबएप से विंडोज प्रमाणीकरण का उपयोग कर SQL सर्वर से कनेक्ट कर सकता हूं?

  3. NULL =NULL SQL सर्वर में गलत का मूल्यांकन क्यों करता है

  4. एक बहु-चरणीय SQL सर्वर एजेंट कार्य बनाएँ (T-SQL)

  5. मैं SQL सर्वर में वर्चर या चार फ़ील्ड में अनुमत सभी विशेष वर्ण कैसे देख सकता हूं?