in memory OLTP
تکنولوژی In-Memory OLTP یکی از بهترین های مایکروسافت برای پردازش درون حافظه ای است و از نامگذاری آن مشخص است که اختصاصا برای سیستم های OLTP یا تراکنش آنلاین بوجود آمده است ، این تکنولوژی با SQL Server Engine یکپارچه شده و به عنوان یه کامپوننت در کنار مابقی کامپوننت ها فعالیت کند . In Memory Optimization و Hekaton از نام های دیگر این ویژگی می باشد .
تکنولوژی In-Memory OLTP در ورژن Sql Server 2014 معرفی شد و با استفاده از آن می توانستید داده های جداول خود را در یک زمان در حافظه و دیسک با سرعت بسیار بالا بازیابی و ذخیره کنید . از مهم ترین اتفاقاتی که بعد از پیاده سازی تکنولوژی In-Memory OLTP اتفاق میوفتد افزایش Concurrency بوده و سیستم شما با توجه به سرعت بالایی که در ذخیره سازی اطلاعات دارید می توانید همزمان در خواست های زیادی را پاسخگو بود . البته همه ی قابلیت های جدید قطعا معایبی نیز دارند که این تکنولوژی هم از این قائده مستثنا نبود ، یکی از ضعف های این تکنولوژی این بود که وقتی حجم داده های جداول ما بسیار زیاد می شد و شما کوئری هایی با حالت Analytical مثل select هایی شامل SUM ,count, min, max و … دارید و ایندکس های مناسبی را ایجاد نکرده باشید اجرای کوئری ها با کندی اجرا می شود . برای حل این موضوع مایکروسافت در ورژن 2016 به ازای جدول های Memory Optimized به شما اجازه ساخت NonClustered Column store Index را می دهد .
بعد از پیاده سازی این ویژگی سرعت اجرای کوئری ها تا 100 برابر افزایش می یابد .
جداول Memory-Optimized
این جداول دیتای خود را در حافظه نگهداری میکنند ، این ویژگی بعد از حذف Lock و Latch باعث افزایش عملکرد و کارایی این جدول ها می شوند . دیتای موجود در این جداول در حافظه پردازش شده خوانده و نوشته می شود و در اصل در حافظه مقیم است . این جداول را می توان در کنار جدول های Disk-Based مورد استفاده قرار داد .
پراسیجر Natively-Compile
اینپراسیجر فقط می تواندبه جدول هایی با ساختار Memory-Optimized و جداولی با این ویژگی کار کرده و دسترسی داشته باشد . این پراسیجر ها بعد از بارگذاری در حافظه به کد ماشینی کامپایل می شوند تا در SqlServer به عنوان یه فرآیند درون حافظه ای مورد استفاده قرار بگیرد و علت سرعت بسیار بالا و کارایی فوق العاده آنها نسبت به پراسیجر های معمولی In-Memory بودن آنها می باشد . باید توجه داشت که این مدل پراسیجر ها تنها تعداد دستور محدودی را پشتیبانی میکنند .
معماری ویژگی In-Memory OLTP مشابه شکل زیر می باشد :
مزایای استفاده از ویژگی In-Memory OLTP چیست ؟
- عدم درگیری با Bufferpool در SQLServer
- افزایش سرعت و راندمان (در شرایط خاص حتی تا 30 برابر)
- lock & latch Free
این تکنولوژی در زمان معرفی در سال 2014 محدودیت های زیادی داشت و به نوعی هنوز خام بود، از این محدودیت های می توان به موارد زیر اشاره کرد :
- در صورت Nullable بودن ستون ها امکان تعریف ایندکس برروی آنها وجود ندارد.
- دستورهای distinct, union all ,join union , outer join union قابل اجرا نیستند .
- حداکثر 256 گیگا بایت RAM را پشتیبانی میکند .
- بعد از ایجاد جدول های In-Memory-optimized قابلیت تغییر (Alter Table) نخواهند داشت .
بسیاری از محدودیت های نسخه اولیه In-Memory OLTP در نسخه 2016 مرتفع شد ، مثل محدودیت حافظه که تا 2TB افزایش پیدا کرد .
ایجاد یک In-Memory-Optimized-table
برای ایجاد این ویژگی باید یک FileGroup از نوع Memory_Optimized_Table بر روی یک دیتابیس ایجاد کنیم :
--sqldba.ir
USE master
GO
CREATE DATABASE Test_InMemoryOLTP ON PRIMARY
( NAME = N'Test_InMemoryOLTP', FILENAME = N'D:\Databases\Test_InMemoryOLTP.mdf',SIZE = 4096KB , FILEGROWTH = 1024KB )
LOG ON
(NAME = N'Test_InMemoryOLTP',FILENAME = N'D:\Databases\Test_InMemoryOLTP.ldf'
,SIZE = 2048KB , FILEGROWTH = 10%)
GO
--sqldba.ir
ALTER DATABASE Test_InMemoryOLTP ADD FILEGROUP Test_InMemoryOLTP_FG CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE Test_InMemoryOLTP ADD FILE (name='Test_InMemoryOLTPDF', filename='D:\Databases\Test_InMemoryOLTP')
TO FILEGROUP Test_InMemoryOLTP_FG
ALTER DATABASE Test_InMemoryOLTP SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
--sqldba.ir
در صورت وجود دیتابیس از قبل از می توانید از اسکریپت زیر جهت تغییر به IN-Memory استفاده کنیم :
--sqldba.ir
ALTER DATABASE Test_InMemoryOLTP
ADD FILEGROUP INMemoryFG CONTAINS MEMORY_OPTIMIZED_DATA;
--sqldba.ir
GO
ALTER DATABASE Test_InMemoryOLTP
ADD FILE (NAME='INMemoryFG', FILENAME='D:\Databases\INMemoryFG')
TO FILEGROUP INMemoryFG;
GO
برای ساخت جداول In-Memory-Optimized باید به دو حالت قابل ایجاد توجه کنید
حالت پیش فرض آن : Durable بودن جدول
این حالت این امکان را می دهد که اگر برای سرور مشکلی پیش آمد و Crash کرد و یا Failover شد از فایل لاگ می توان دیتا را بازیابی کرد ولی در حالت Non-Durable این امکان وجود ندارد .
حالت های بالا بسته به بیزینس شما قابل تغییر است و انتخاب آن بسته به نوع کسب و کار می تواند تغییر کند . به طور مثال اگر بخواهید برای DataWareHouse که دیتای آن بارها با رکورد های میلیونی کم و زیاد می شود و نتایج خروجی پردازشی آن به جای دیگری و جدول دیگری منتقل می شود تعریف حالت Non-Durable بر روی جدول Memory-Optimized بسیار مناسب می باشد .
خاصیت “SCHEMA_ONLY” در صورت کرش کردن و اختلال سرور تنها اسکیمای جدول قابل بازیابی است ، اگر بخواهیم به صورت Durable تعریف کنیم باید از خاصیت “SCHEMA_AND_DATA” استفاده کنیم .
در این جدول باید ایندکس ها را به صورت NonClustered تعریف کنیم و امکان تعریف ایندکس Clustered وجود ندارد ، در هنگام تعریف کردن ایندکس ها حتما باید مقدار پارامتر BUCKET_COUNT تعیین شود . مقدار مورد نظر برای این پارامتر بین 1.5 تا 2 برابر تعداد مقادیر یونیک ستون ایندکس باشد . پراسیجر Natively-Compiled قبلیت این را دارد که جداول Memory-Optimized را با بکار بردن دستور های T-sql مثل ساب کوئری ها ، توابع عددی ، و … بکار ببرند. برای ساخت جدول با ویژگی In-Memory از اسکریپت زیر استفاده کنید :
--SQLDBA.IR
USE Test_InMemoryOLTP
GO
CREATE TABLE dbo.Product
(
ID INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000),
Code VARCHAR(10) NOT NULL,
Description VARCHAR(200) NOT NULL,
Price FLOAT NOT NULL
)WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY);
--SQLDBA.IR
برای ساخت پراسیجر Natively-Compiled می توان از اسکریپت زیر استفاده کرد :
USE Test_InMemoryOLTP
GO
--SQLDBA.IR
CREATE PROC dbo.sp_ProductUpdate
WITH NATIVE_COMPILATION,
SCHEMABINDING,
EXECUTE AS OWNER
AS
BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'us_english' )
--SQLDBA.IR
UPDATE dbo.Product
SET Price = Price – ( Price * 0.10 );
END;
در هنگام تعریف پراسیجر های Natively-Compiled نکات زیر را مد نظر قرار دهید :
- از WITH Native_Compilation استفاده کنید .
- برای مشخص شدن اسکیمای جداولی که مورد استفاده قرار داده اید از SCHMABINDING استفاده کنید .
- عبارت BEGIN_ATOMIC برای اجرای تمامی موارد درون پراسیجر استفاده می شود تا یا همه آنها اجرا شود و یا تماما اجرا نشود .
در این جداول فقط میتوان Constraint های زیر را تعریف کرد :
- کلید خارجی را پشتیبانی نمی کند .
- به جز Primary Key هیچ گونه Unique Key دیگری را نمی توان تعریف کرد .
- حداکثر 8 ایندکس را می توان تعریف کرد .
برای مطالعه بیشتر در این مورد می توانید به منبع مقاله که در لینک زیر وجود دارد به وب سایت مایکروسافت مراجعه کنید :
تکنولوژی In-Memory OLTP در دیتابیس SQL Server یکی از ویژگیهای کاربردی است که باعث بهبود عملکرد برنامههای تراکنشی میشود. با استفاده از این تکنولوژی، دادهها به صورت کامل در حافظه نگهداری و پردازش میشوند که باعث افزایش سرعت و کاهش زمان پاسخ در عملیاتهای تراکنشی میشود. در زیر، برخی از مزایا و جوانب قابل توجه تکنولوژی In-Memory OLTP در دیتابیس SQL Server را بررسی میکنیم:
1. بهبود عملکرد: یکی از مزایای اصلی In-Memory OLTP، بهبود قابل توجه در عملکرد برنامههای تراکنشی است. با ذخیره و پردازش دادهها در حافظه، زمان دسترسی به دادهها به طور چشمگیری کاهش مییابد و عملیات تراکنشی سریعتر انجام میشود.
2. مدیریت همزمانی: In-Memory OLTP از روشهای همزمانی بهره میبرد که به طور قابل توجهی باعث افزایش قابلیت همزمانی و مقیاسپذیری برنامههای تراکنشی میشود. این تکنولوژی از روشهای بدون قفل و کنترل همزمانی بر پایه نسخهبندی چندگانه استفاده میکند.
3. عدم نیاز به دیسک برای برخی دادهها: با استفاده از In-Memory OLTP، میتوان برخی از دادهها را به صورت کامل در حافظه نگهداری کرد و نیازی به دسترسی به دیسک برای این دادهها نیست. این موضوع بهبود قابل توجهی در سرعت و عملکرد دسترسی به این دادهها ایجاد میکند.
4. افزایش ظرفیت حافظه:
با استفاده از In-Memory OLTP، میتوان ظرفیت حافظه مورد استفاده در دیتابیس را به طور قابل توجهی افزایش داد. این امکان را میدهد تا حجم بزرگی از دادهها را در حافظه نگهداری و پردازش کنید، که باعث افزایش کارایی و کاهش زمان پاسخ میشود.
5. امکان ترکیب با دیگر قابلیتها: تکنولوژی In-Memory OLTP در SQL Server با سایر قابلیتها و امکانات دیتابیس سازگار است. بنابراین، میتوانید از این تکنولوژی در کنار دیگر قابلیتهای SQL Server مانند امکانات دیسکی و قابلیتهای پشتیبانی از برنامههای تراکنشی استفاده کنید.
6. نیاز به بررسی موارد استفاده: برای استفاده از In-Memory OLTP، باید مورد استفاده مناسب را با دقت بررسی کنید. این تکنولوژی برای برنامههایی که نیاز به عملکرد بالا و زمان پاسخ کمتر دارند، مثل برنامههای تراکنشی با تعداد بالای کاربران همزمان، مناسب است.
7. مدیریت و راهاندازی: SQL Server ابزارها و قابلیتهای مدیریت و راهاندازی برای In-Memory OLTP را فراهم میکند. این ابزارها شامل ایجاد و تغییر جداول In-Memory، نمودارهای عملکرد مخصوص اشیاء حافظهنگهداری شده و گزارشهای سازگاری برای شناسایی قابلیتهای T-SQL که برای جداول حافظهنگهداری شده پشتیبانی نمیشوند، میباشد.
در کل، In-Memory OLTP یک تکنولوژی قدرتمند است که میتواند در بهبود عملکرد برنامههای تراکنشی در SQL Server تاثیر قابل توجهی داشته باشد. با انتخاب موارد مناسب برای استفاده از این تکنولوژی و بهینهسازی دسترسی به دادهها، میتوانید عملکرد سیستم خود را بهبود بخشید.
ممنون از شما
مطلب خیلی مفیدی بود
با سلام
نظر لطف شماست دوست عزیز