خانه SQL Server آشنایی با تکنولوژی In-Memory OLTP SQL Server افزایش سرعت SQL Server نوشته شده توسط: احسان حسین پور تاریخ انتشار: ۱۳ شهریور ۱۳۹۷ آخرین بروزرسانی: 27 شهریور 1402 زمان مطالعه: 14 دقیقه ۳ (۶) مقدمه تکنولوژی In-Memory OLTP In-Memory OLTPکه با نام Hekaton یا In-Memory Optimization هم معرفی میشود. آخرین تکنولوژی پردازش حافظهای مایکروسافت است. همانطور که از نام In-Memory OLTP پیداست این تکنولوژی برای استفاده در سیستمهای تراکنش برخط یا OLTP به وجود آمده است. In-Memory OLTP کاملا با موتور SQL Server تجمیع شده است، به عبارت دیگر میتواند همانند سایر کامپوننتهای SQL Server Database Engine به کار گرفته شود. این تکنولوژی در SQL Server 2014 با دو ویژگی اصلی جداول Memory-Optimized و پروسیجرهای Natively-Compile معرفی شد که در ادامه به بررسی بیشتر این ویژگیها میپردازیم. جداول Memory-Optimized جداول Memory-Optimized جداولی هستند که دیتای خود را در حافظه ذخیره میکنند. این ویژگی با حذف Lock و Latch منجر به افزایش عملکرد و کارایی این نوع جداول شده است. دیتا در این نوع جداول از حافظه خوانده میشوند و در حافظه نوشته میشوند، یعنی کاملا در حافظه مقیم هستند. همچنین میتوان از این جداول در کنار جداول Disk-Based استفاده کرد. پروسیجر Natively-Compile پروسیجر Natively-Compile پروسیجری است که تنها میتواند به ساختارهای Memory-Optimized مانند جداول Memory-Optimized دسترسی داشته باشد. این نوع از پروسیجرها به کد ماشین کامپایل میشوند و در حافظه بارگذاری میشوند تا در فرآیند حافظهای SQL Server مورد استفاده قرار گیرند. به همین دلیل بسیار سریعتر و کاراتر از پروسیجرهای معمولی هستند. همچنین این پروسیجرها دستورات محدودی از TSQL را پشتیبانی میکنند. برای استفاده از ویژگیهای Memory-Optimized باید یک FileGroup از نوع MEMORY_OPTIMIZED_DATA برای دیتابیس ایجاد کنیم. USE master GO CREATE DATABASE InMemoryDbDemo ON PRIMARY ( NAME = N'InMemoryDbDemo', FILENAME = N'D:\Databases\InMemoryDbDemo.mdf',SIZE = 4096KB , FILEGROWTH = 1024KB ) LOG ON (NAME = N'InMemoryDbDemo_log',FILENAME = N'D:\Databases\InMemoryDbDemo_log.ldf' ,SIZE = 2048KB , FILEGROWTH = 10%) GO ALTER DATABASE InMemoryDbDemo ADD FILEGROUP InMemoryDbDemo_FG CONTAINS MEMORY_OPTIMIZED_DATA ALTER DATABASE InMemoryDbDemo ADD FILE (name='InMemoryDbDemoDF', filename='D:\Databases\InMemoryDbDemo') TO FILEGROUP InMemoryDbDemo_FG ALTER DATABASE InMemoryDbDemo SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON GO ساخت جداول Memory-Optimized با دو حالت durable و non-durable قابل تعریف است. حالت پیشفرض Durable است به این معنی که اگر سرور Carsh کند یا Failover شود، دیتای جدول از فایل لاگ قابل بازیابی است. و اگر به صورت Non-Durable تعریف شود در صورت اختلال در سرور دیتای این جداول قابل بازیابی نیست. انتخاب تعریف جداول Memory-Optimized به صورتDurable و Non-Durable وابسته به نیازمندیهای کسب و کار است. به طور مثال اگر بخواهید جداول Memory-Optimized را به عنوان بخشی از پردازش موقت انبار داده استفاده کنید که دیتای آن بارها با میلیونها رکورد حذف و اضافه میشود و نتایج پردازش آن به جداول دیگر انتقال مییابد تعریف جدول Memory-Optimized به صورت Non-Durable گزینه مناسبی است. USE InMemoryDbDemo 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); GO ویژگی “SCHEMA_ONLY” به این معنی است که تنها اسکیمای جدول در صورت اختلال سرور قابل بازیابی است. اگر بخواهیم جدول را به صورت Durable تعریف کنیم. باید از “SCHEMA_AND_DATA” استفاده کنیم. USE InMemoryDbDemo 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_AND_DATA); GO همانطور که در تعریف جداول Memory-Optimized مشاهده کردید. ایندکس باید به صورت Non-Clustered تعریف شود. در واقع در جداول Memory-Optimized امکان تعریف ایندکس به صورت Clustered وجود ندارد. در تعریف ایندکس لازم است که مقدار BUCKET_COUNT تعیین شود. مقدار پیشنهادی برای BUCKET_COUNT بین ۱.۵ تا ۲ برابر تعداد مقادیر یکتای ستون ایندکس است. پروسیجرهای Natively-compiled میتوانند جداول Memory-Optimized را با استفاده از دستورات T-SQL مانند Subquery ها، توابع عددی و … به کار گیرند. بر اساس مثال قبلی پروسیجر زیر ستون Price در جدول Product را بروزرسانی میکند. USE InMemoryDbDemo GO CREATE PROC dbo.sp_ProductUpdate WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) UPDATE dbo.Product SET Price = Price - ( Price * 0.10 ); END; در تعریف پروسیجرهای Natively-compiled باید موارد زیر را در نظر بگیرید عبارت WITH NATIVE_COMPILATIONباید استفاده شود عبارت SCHMABINDING لازم است زیرا اسکیمای جداولی که در آن مورد استفاده قرار میگیرد مشخص میشود. عبارت BEGIN_ATOMIC مورد استفاده قرار میگیرد یعنی همه دستورات درون پروسیجر اجرا میشوند یا هیچکدام از آنها اجرا نمیشود. محدودیتهای تکنولوژی In-Memory OLTP تکنولوژی In-Memory OLTP در زمان ارایه در نسخه SQL Server 2014 محدودیتهای زیادی به همراه داشت. برخی از این محدودیتها به شرح زیر است. عدم امکان تعریف ایندکس بر روی ستونهای nullable عدم امکان استفاده از دستورات OUTER JOIN UNION, UNION ALL, DISTINCT, حداکثر استفاده از حافظه RAM تا 256GB عدم امکان تغییر (ALTER) جداول Memory-Optimized بعد از ایجاد جدول بسیاری از این محدودیتها در نسخهSQL Server 2016 به بعد برداشته شدهاند. به طور مثال حداکثر فضای استفاده از RAM در این جداول 2TB شده است یا امکان تغییر جدول بعد از ایجاد آن فراهم شده است. چه رتبه ای میدهید؟ میانگین ۳ / ۵. از مجموع ۶ اولین نفر باش دانلود مقاله آشنایی با تکنولوژی In-Memory OLTP فرمت PDF 4 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 4 مقاله توسط این نویسنده محصولات 4 دوره توسط این نویسنده احسان حسین پور احسان حسین پور مدیر بانک اطلاعاتی در شرکت پرداخت الکترونیک سداد و همچنین مدرس و مشاور SQL Server در نیکآموز است. از دیگر سوابق او به مدیر پایگاه داده در شرکت حصین ، مدیر فنی توسعه سامانه نیکنام، ، متخصص سیستمهای انبارداده و هوش تجاری، طراحی In-Memory OLTP در SQL Server اشاره کرد. معرفی محصول احسان حسین پور In-Memory OLTP و Columnstore در SQL Server 1.890.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ mohammad.shaneh@gmail.com ۰۳ / ۰۷ / ۹۷ - ۰۲:۴۳ با سلام و خسته نباشید. من یه مشکل دارم.هرکاری میکنم نمیتونم FileGroup را پاک کنم. sql من ۲۰۱۴ هست. هر چی هم سرچ زدم نوشته بود امکانش نیست و باید دیتابیس را حذف کنید و دوباره ایجاد کنید ولی دیتابیس من داره استفاده میشه و امکان حذفش برای من نیست… الان هم میخوام بک اپ از دیتابیس بگیرم خطای زیر را میده : FILESTREAM data container ‘D:\Data\memfg_File’ is corrupted. Database cannot recover. (Microsoft SQL Server, Error: 5535) ممنون میشم راهنمایی کنید … پاسخ به دیدگاه مسعود طاهری ۰۳ / ۰۷ / ۹۷ - ۰۳:۰۵ این فایل گروه دارای تعدادی Meta Data در NTFS است آیا اون ها 1- پاک شدن 2- آسیب دیدن ببینید با DBCC CheckDB دیتابیس چه خطایی می دهد ؟ پاسخ به دیدگاه mohammad.shaneh@gmail.com ۰۳ / ۰۷ / ۹۷ - ۰۲:۴۳ با سلام و خسته نباشید. من یه مشکل دارم.هرکاری میکنم نمیتونم FileGroup را پاک کنم. sql من ۲۰۱۴ هست. هر چی هم سرچ زدم نوشته بود امکانش نیست و باید دیتابیس را حذف کنید و دوباره ایجاد کنید ولی دیتابیس من داره استفاده میشه و امکان حذفش برای من نیست… الان هم میخوام بک اپ از دیتابیس بگیرم خطای زیر را میده : FILESTREAM data container ‘D:\Data\memfg_File’ is corrupted. Database cannot recover. (Microsoft SQL Server, Error: 5535) ممنون میشم راهنمایی کنید … پاسخ به دیدگاه مسعود طاهری ۰۳ / ۰۷ / ۹۷ - ۰۳:۰۵ این فایل گروه دارای تعدادی Meta Data در NTFS است آیا اون ها 1- پاک شدن 2- آسیب دیدن ببینید با DBCC CheckDB دیتابیس چه خطایی می دهد ؟ پاسخ به دیدگاه مسعود طاهری ۱۳ / ۰۶ / ۹۷ - ۰۴:۵۴ احسان عزیز تشکر منتظر قسمت های بعدی مقاله هستیم پاسخ به دیدگاه مسعود طاهری ۱۳ / ۰۶ / ۹۷ - ۰۴:۵۴ احسان عزیز تشکر منتظر قسمت های بعدی مقاله هستیم پاسخ به دیدگاه عطا ۱۳ / ۰۶ / ۹۷ - ۰۳:۱۵ بسیار عالی بود. ممنون پاسخ به دیدگاه