پشتیبانی از کلید خارجی در memory optimized table در SQL Server 2016

مشخصه پردازش تراکنش آنلاین حاوی حافظه ( OLTP ) در SQL Server که با نام Hekton نیز شناخته می شود، یک تکنولوژی تحلیل آنلاین تراکنش هاست که در SQL Server 2014 مطرح شده است و به منظور بهینه سازی حجم کاری این پردازش ها به کار برده می شود

این قابلیت همانند هر ویژگی دیگری شامل محدودیت هایی  مانند تعریف کلید خارجی در memory optimized table می باشد. آیا در SQL Server 2016 این محدودیت برطرف شده است ؟

در واقع OLTP با به کار گیری فناوری تحلیل آنلاین و حاوی حافظه عملکرد اجرای query ها را در SQL بهبود می بخشد لیکن به دلیل محدودیت های آن در بسیاری از موارد راه حل عملی نیست.

اگرچه در SQL Server 2016 برخی از این محدودیت ها برطرف شده اند که به کاربردی تر بودن این ویژگی کمک شایانی کرده است. یکی از انواع این محدودیت ها مربوط به ایجاد کلید خارجی برای این جداول می باشد چرا که حفظ جامعیت داده ها در این جداول بسیار مهم است.

در این بخش ما به بررسی این موضوع در هر دو instance 2014 و ۲۰۱۶ که هر دو شامل یک پایگاه داده با نام Mot برای تست می باشند می پردازیم.

در اسکریپت زیر در ابتدا پایگاه داده ی تست  بالا را در هر دو instance می سازیم تا بتوانیم با استفاده از  filegroup فایل های داده ای جدید را در جداول تعریف کنیم و سپس در ادامه Memory-optimizer-Elevate-ToSnapshot را فعال می نماییم.

بنابراین پایگاه داده ی تست برای میزبانی جداول بهینه شده در هر دو نسخه SQL  مهیا است. همچنین جدولی با نام EmployeeDep-memoryOpt را به عنوان یکی از این جداول تعریف می نماییم که به عنوان جدول پدر یا اصلی در پایگاه داده در نظر گرفته می شود.

در ادامه  فرزندی برای جدول قبلی تعریف می شود که کلید خارجی آن با نام columnid از جدول قبلی تعریف می شود.

در اسکریپت زیر  این جدول را در SQL Server 2014 تعریف می کنیم:

با اجرای اسکریپت  با پیغام خطا زیر با این عنوان که کلید خارجی در جدول پدر پشتیبانی نمی شود روبرو می شویم.

در صورتی که بخواهیم این دستور را در SQL Server 2016 تعریف نماییم، مشکلی نخواهیم داشت.

همچنین می توانیم صحت این موضوع را با تعریف دو سطر جدید در جدول تعیین نماییم.

و نیز  یک سطر جدید که Dep-id آن مقداری خارج از مقادیر جدول پدر می باشد

دستور insert برای تعریف این سطر جدید با مشکل روبرو می شود

بار دیگر سطر جدیدی را با مقدار  معتبر Dep-id موجود تعریف می نماییم

سطر با موفقیت ذخیره شده است

چه اتفاقی می افتد اگر جدولی با فضای دیسک استاندارد و حاوی کلید خارجی  داشته باشیم که جدول مرجع آن یک جدول  memory optimized table باشد؟

در ادامه  جدول Employee_Phisicql _table  با schema مشابه جدول Employee_MemOPTtable را داریم با این تفاوت که حافظه ی نرمالی برای جدول داشته باشیم و نیز  کلید خارجی Dep_ID  که از جدول مرجع EmployeeDep_memOpt گرفته شده است.

خروجی نشان می دهد که ارتباط میان جدول memory optimized table  با جدول بدون حافظه از طریق کلید خارجی در SQL server 2016 با پیغام خطا زیر روبرو است.