SQL सर्वर इन-मेमोरी OLTP के बारे में लेखों की श्रृंखला में यह दूसरा लेख है।
परिचयात्मक लेख - SQL सर्वर इन-मेमोरी OLTP, ने संक्षेप में नए Hekaton इंजन की मूल बातें पेश कीं। इस भाग में हम अभ्यास पर ध्यान देंगे। अधिक विशिष्ट होने के लिए, हम देखेंगे कि इन-मेमोरी अनुकूलित डेटाबेस और टेबल कैसे बनाएं, और साथ ही, टी-एसक्यूएल की सहायता से उनका आकलन कैसे करें।
स्मृति-अनुकूलित डेटाबेस का उपयोग शुरू करने के लिए आवश्यक शर्तें
इन-मेमोरी OLTP स्वचालित रूप से SQL Server 2014 या SQL Server 2016 के 64-बिट एंटरप्राइज़ या डेवलपर संस्करण के साथ स्थापित हो जाता है। SQL Server 32-बिट संस्करण इन-मेमोरी OLTP घटक प्रदान नहीं करता है।
इस प्रकार, यदि आपके कंप्यूटर पर SQL सर्वर का 64-बिट डेवलपर संस्करण स्थापित है, तो आप डेटाबेस और डेटा संरचनाएं बनाना शुरू कर सकते हैं जो बिना किसी अतिरिक्त सेटअप के मेमोरी-अनुकूलित डेटा संग्रहीत करेंगे।
स्मृति-अनुकूलित तालिकाओं वाले प्रत्येक डेटाबेस में एक MEMORY_OPTIMIZED_DATA फ़ाइल समूह होना चाहिए। इस फ़ाइल समूह में एक या कई कंटेनर हैं। हर एक कंटेनर डेटा और/या डेल्टा फाइलों को स्टोर करता है। SQL सर्वर इन फ़ाइलों का उपयोग स्मृति-अनुकूलित तालिकाओं को पुनर्प्राप्त करने के लिए करता है। कंटेनरों को विभिन्न डिस्क सरणियों पर रखा जा सकता है,
FILESTREAM फ़ाइल समूह के समान।
स्मृति-अनुकूलित फ़ाइल समूह बनाने का सिंटैक्स लगभग पारंपरिक FILESTREAM फ़ाइल समूह के समान है, जिसमें कई अंतर हैं:
- डेटाबेस के लिए केवल एक स्मृति-अनुकूलित फ़ाइल समूह बनाया जा सकता है।
- CONTAINS MEMORY_OPTIMIZED_DATA विकल्प स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए।
आप डेटाबेस बनाने की प्रक्रिया में फ़ाइल समूह बना सकते हैं:
CREATE DATABASE InMemoryDemo ON PRIMARY ( NAME = N'InMemoryDemo', FILENAME = N'D:\Data\InMemoryOLTPDemo.mdf' ), FILEGROUP IMOFG CONTAINS MEMORY_OPTIMIZED_DATA ( NAME = N'InMemoryDemo_Data', FILENAME = N'D:\IMOFG\InMemoryDemo_Data.mdf' )
वैकल्पिक रूप से, आप किसी मौजूदा डेटाबेस में MEMORY_OPTIMIZED_DATA फ़ाइल समूह जोड़ सकते हैं, और फिर उस फ़ाइल समूह में फ़ाइलें जोड़ सकते हैं।
-- Adding the containers ALTER DATABASE DemoDB ADD FILE ( NAME = 'DemoDB_Mod', FILENAME = 'D:\Data\DemoDB_Mod' ) TO FILEGROUP DemoDB_Modमें
आंतरिक रूप से, इन-मेमोरी OLTP FILESTREAM तकनीक पर आधारित एक स्ट्रीमिंग तंत्र का उपयोग करता है, जो क्रमिक I/O पहुंच के लिए अच्छी तरह से अनुकूलित है।
स्मृति-अनुकूलित तालिकाएँ बनाना
अब, हमारे पास मेमोरी-ऑप्टिमाइज़्ड ऑब्जेक्ट बनाना शुरू करने के लिए आवश्यक सब कुछ है। आइए एक मेमोरी-ऑप्टिमाइज़्ड टेबल बनाएं।
इन-मेमोरी-ऑप्टिमाइज़्ड टेबल बनाने का सिंटैक्स डिस्क-आधारित टेबल बनाने के लिए बहुत समान है। हालांकि, कुछ एक्सटेंशन और प्रतिबंध हैं:
- MEMORY_OPTIMIZED =ON क्लॉज एक टेबल को इन-मेमोरी ऑप्टिमाइज़ के रूप में पहचानता है।
- इन-मेमोरी-ऑप्टिमाइज़्ड टेबल उन सभी डेटा प्रकारों का समर्थन नहीं करते हैं जो पारंपरिक टेबल समर्थन करते हैं। निम्न डेटा प्रकार समर्थित नहीं हैं:
- डेटाटाइमऑफ़सेट
- भूगोल
- ज्यामिति
- पदानुक्रमित
- पंक्ति संस्करण
- एक्सएमएल
- sql_variant
- उपयोगकर्ता-परिभाषित प्रकार
स्मृति-अनुकूलित तालिका निम्न स्थायित्व मानों के साथ बनाई जा सकती है:SCHEMA_AND_DATA या SCHEMA_ONLY। SCHEMA_AND_DATA डिफ़ॉल्ट मान है।
यदि आप SCHEMA_ONLY निर्दिष्ट करते हैं, तो तालिका में सभी परिवर्तन लॉग नहीं किए जाएंगे और तालिका डेटा डिस्क पर संग्रहीत नहीं है।
प्रत्येक स्मृति-अनुकूलित तालिका में कम से कम एक अनुक्रमणिका होनी चाहिए। ध्यान दें कि प्राथमिक कुंजी बाधा परोक्ष रूप से एक अनुक्रमणिका बनाता है। एक टिकाऊ स्मृति-अनुकूलित तालिका के लिए हमेशा प्राथमिक कुंजी बाधा की आवश्यकता होती है।
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
समग्र अनुक्रमणिकाएं तब जोड़ी जा सकती हैं जब सभी स्तंभ बन चुके हों:
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ,INDEX T1_INDX_C1C2 NONCLUSTERED ([Name], [City]) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
जब आप इन-मेमोरी ऑप्टिमाइज्ड टेबल बनाते हैं, तो इन-मेमोरी ओएलटीपी इंजन उस टेबल तक पहुंचने में सक्षम होने के लिए डीएमएल रूटीन बनाता है। यह डीएलएल फाइलों के रूप में दिनचर्या लोड करता है। एक विशिष्ट ऑपरेशन के लिए, SQL सर्वर एक आवश्यक DLL फ़ाइल को कॉल करता है।
टेबल और इंडेक्स बदलना
SQL सर्वर 2016 से पहले तालिकाओं को बदलना असंभव था। स्कीमा परिवर्तन करने के लिए, आपको इन-मेमोरी तालिका को छोड़ना और फिर से बनाना होगा।
SQL सर्वर की नई रिलीज़ में, ALTER TABLE आंशिक रूप से समर्थित है।
SQL सर्वर 2016 आपको ऑफ़लाइन संचालन करने की क्षमता प्रदान करता है:कॉलम, इंडेक्स और बाधाओं को जोड़ना और छोड़ना (संशोधित करना)। साथ ही, SQL सर्वर टेबल एडिटर के लिए SSMS टेबल डिज़ाइनर या dbForge Studio का उपयोग करके इन-मेमोरी टेबल के साथ काम करना अब संभव है।
ध्यान दें कि ALTER TABLE को टेबल के पुनर्निर्माण की आवश्यकता होती है। इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि इस ऑपरेशन को चलाने से पहले आपके पास पर्याप्त मेमोरी है। पुनर्निर्माण कार्य के दौरान, प्रत्येक पंक्ति को नई तालिका में पुन:सम्मिलित किया जाता है और जब ALTER कार्रवाई की जा रही होती है तब तालिका उपलब्ध नहीं होती है।
आप एक ही टेबल में कई बदलाव कर सकते हैं और उन्हें एक ही ALTER TABLE स्टेटमेंट में जोड़ सकते हैं। आप कॉलम, इंडेक्स और बाधाओं को जोड़ सकते हैं और आप कॉलम, इंडेक्स और बाधाओं को छोड़ सकते हैं। ध्यान दें कि आप ADD और DROP कमांड को एक ही ALTER TABLE में संयोजित नहीं कर सकते।
-- index operations -- change hash index bucket count ALTER TABLE dbo.TableName ALTER INDEX IX_Name REBUILD WITH (BUCKET_COUNT = 131072); GO -- add index ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName); GO -- drop index ALTER TABLE dbo.TableName DROP INDEX IX_Name; GO -- add multiple indexes ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName), INDEX IX_Name2 NONCLUSTERED (ColName2); GO -- Add a new column and an index ALTER TABLE dbo.TableName ADD Date DATETIME, INDEX IX_Name NONCLUSTERED (ColName); GO -- Drop a column ALTER TABLE dbo.TableName DROP COLUMN ColName; GO
तालिका प्रकार और तालिका चर
SQL सर्वर 2016 आपको मेमोरी-अनुकूलित तालिका प्रकार बनाने की क्षमता प्रदान करता है जिसका उपयोग आप तालिका चर को परिभाषित करते समय कर सकते हैं:
CREATE TYPE TypeName AS TABLE ( Col1 SMALLINT NOT NULL, Col2 INT NOT NULL, Col3 INT NOT NULL, Col4 INT NOT NULL, INDEX IX_Col1 NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 131072), INDEX IX_Col1 NONCLUSTERED (Col2)) WITH (MEMORY_OPTIMIZED = ON); GO DECLARE @VariableName TypeName; GO
यह वेरिएबल केवल मेमोरी में स्टोर होता है। मेमोरी में अनुकूलित टेबल और टेबल प्रकार समान डेटा संरचनाओं का उपयोग करते हैं, इसलिए डेटा एक्सेस डिस्क-आधारित तालिका चर की तुलना में अधिक कुशल होने वाला है।
अधिक विवरण के लिए, कृपया निम्नलिखित एमएसडीएन ब्लॉग पोस्ट देखें:मेमोरी ऑप्टिमाइज़ेशन का उपयोग करके अस्थायी तालिका और तालिका चर प्रदर्शन में सुधार
सारांश
इन-मेमोरी ओएलटीपी एक अपेक्षाकृत युवा तकनीक है जिसे विशाल और बहुत व्यस्त ओएलटीपी सिस्टम के साथ काम करने के लिए डिज़ाइन किया गया है जो सैकड़ों या हजारों समवर्ती उपयोगकर्ताओं का समर्थन करता है। इसे SQL Server 2014 में पेश किया गया था और SQL Server 2016 में विकसित किया गया था।
साथ ही, तकनीक में कई प्रतिबंध और सीमाएँ हैं।
मेमोरी द्वारा समर्थित सभी T-SQL सुविधाएँ और डेटा प्रकार नहीं- अनुकूलित तालिकाएँ, ऐसी तालिकाओं में ऐसी पंक्तियाँ नहीं हो सकतीं जो 8060 बाइट्स से अधिक हों, और
ROW-OVERFLOW और LOB संग्रहण का भी समर्थन नहीं करती हैं। एक बार टेबल बन जाने के बाद आप टेबल और इंडेक्स (एसक्यूएल सर्वर 2014 में) में बदलाव नहीं कर सकते।
यह भी पढ़ें:
SQL सर्वर मेमोरी-ऑप्टिमाइज़्ड टेबल्स में इंडेक्स का उपयोग करना