آیا NonClustered Columnstore Index گزینه مناسبی است؟

در ماه جولای یک ایمیل دریافت کردم به این مضمون که « ما در حال حاضر از سیستم OBIEE بر روی سرور اصلی استفاده می کنیم که پایگاه داده آن روی SQL Server 2012 است. استفاده از این سیستم فقط برای برخی از گزارشات است. از هفته گذشته سرعت تولید این گزارشات بسیار پایین آمده به صورتی که قبلا چند ثانیه به طول می انجامید اما در حال حاضر به بیش از ۳۰ دقیقه به طول می انجامد. در این مدت استفاده از Tempdb بسیار بالا رفته و پیغام خطای زیر در فایل خطاها به مکرر مشاهده می شود. نیاز به کمک شما دارم. با تشکر کارن. »

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
Process 101:0:37 (0x312c) Worker 0x0000003F9BB32160 appears to be non-yielding on Scheduler 16. Thread creation time: 13081251676778. Approx
Thread CPU Used: kernel 0 ms, user 130703 ms. Process Utilization 77%. System Idle 21%. Interval: 130718 ms.
SQL Server has encountered 1587 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [S:\tempdb.mdf] in database [tempdb] (2). The OS file handle is 0x0000000000001248. The offset of the latest long I/O is: 0x000022ec640000

من در لحظه اول که این پیغام های خطا و استفاده بیش از حد tempdb را متوجه شدم به استفاده از NonClustered Columnstore Index شک کردم که کاهش بازدهی سیستم به دلیل داشتن این گونه ایندکس ها است. شک من به دلیل عملیات داخلی این نوع ایندکسها بود.

Execution Plan

همانطور که در تصویر بالا مشاهده می کنید:

  1. دو عدد Table Spool وجود دارد که باعث استفاده از Tempdb می شود.
  2. دو عدد Nested Loops را می بینیم که تماما هیچ Predicate برای آن تعریف نشده.
  3. یک عدد Filter را می بینیم که داده های ورودی را فیلتر می کند.

در مرحله دوم یک نگاهی به اندازه داده های ورودی و خروجی در هر عملیات انداختم و متوجه شدم که Table Spool داده ای به اندازه 2081KB را به Nested Loop واگذاری می کند و Nested Loop داده ای به اندازه 749MB را به Hash Match واگذاری می کند که در آخر خروجی این عملیات یک رکورد به اندازه 25B است. بعد از آنالیز و بررسی فاکتورهای دیگر در آخر بنده به کارن پیشنهاد تغییر NonClustered Columnstore Index ها به Clustered B-Tree یا NonClustered B-Tree ایندکسها را دادم.جدیدا ایمیلی از ایشان دریافت کردم که تغییرات پیشنهاد داده شده مشکل سرعت سیستم را از بین برده به گزارشات در چند ثانیه تولید می شوند. نکته : ColumnStore Index ها در همه مواقع به درد ما نمی خورند.


حمید ج. فرد
حمید ج. فرد

متخصص پایگاه داده SQL Server Microsoft Certified Master: SQL Server 2008 Microsoft Certified Solutions Master: Charter - Data Platform Microsoft Certified Solutions Expert: Data Platform Microsoft Certified Solutions Associate: SQL Server 2012 Microsoft Certified IT Professional Microsoft Certified Technology Specialist Microsoft Certified Professional Developer Microsoft Certified Trainer CIW Database Design Specialist

نظرات