Column Stored Index یکی از قابلیت‌های جالبی است که در SQL Server 2012 ارائه شده است. بوسیله این قابلیت می‌توان سرعت اجرایی کوئری‌های را تا چندین برابر بهبود بخشید.

مایکروسافت مهمترین هدف خود را از ارائه این قابلیت افزایش سرعت اجرای کوئری‌های بر روی Data Warehouseهای بزرگ ذکر کرده است.

 اما می‌توان از آن در شرایطی خاص بر روی OLTP نیز استفاده نمود.

قبل از اینکه به معرفی این قابلیت جدید SQL Server بپردازیم باید شما با مفاهیم اولیه درباره Performance Tuning آشنا شوید.


۱- آشنایی با مفهوم Data File و Log File : همانطور که می‌دانید یک بانک اطلاعاتی در SQL Server حداقل از دو فایل (Data File و Log File) تشکیل شده است. در Data File کلیه اشیائی (مانند فیلد، جدول، ایندکس و…) که شما ایجاد می‌کنید ذخیره می‌شود و به طور ساده در Log File هر چیزی که منجر به تغییر این داده‌ها شود ذخیره می‌شود. برای مثال چنانچه شما مقدار رکوردی را تغییر دهید Log عملیات مربوط به تغییر در Log File ثبت می‌گردد. این Log می‌تواند شامل تصویر داده قبل و بعد از تغییر داده و همچنین زمان انجام کار و… باشد.

۲- آشنایی با مفهوم Page : همانطور که قبلاً هم اشاره کردیم داده‌هایی که شما ایجاد کرده‌اید در درون Data File ثبت می‌شود. درون Data File بلوک‌های ۸KB قرار دارد که به این بلوک‌ها Page می‌گویند. در SQL Server بیش از ۱۰ نوع Page وجود دارد. که SQL Server بر حسب نیاز از آنها استفاده می‌کند.

۳- آشنایی با مفهوم Index در SQL Server: به طور خیلی ساده، ایندکس لیست مرتب شده‌ای از داده‌ها است که بر اساس منطقی خاص مانند عدد، رشته، تاریخ و … ایجاد شده است. هدف از ایجاد ایندکس افزایش سرعت جستجو برای بازیابی داده‌ها می‌باشد.

۴- آشنایی با انواع ایندکس‌ها:

در SQL Server  پنج نوع ایندکس به شرح زیر وجود دارد

• Clustered Index: این نوع ایندکس‌ها بر روی داده‌های عادی مانند عدد، رشته، تاریخ و… ایجاد می‌شوند. زمانیکه یک Clustered Index بر روی یک جدول ایجاد می‌کنید ترتیب و چینش فیزیکی رکوردها بر اساس کلید ایندکس خواهد بود. بنابراین یک جدول صرفاً می‌تواند یک ایندکس از نوع Clustered  داشته باشد.

 

• NonClustered Index: این نوع ایندکس‌ها مانند Clustered Indexها بر روی داده‌های عادی مانند عدد، رشته، تاریخ و… ایجاد می‌شوند. زمانیکه یک ایندکس از نوع NonClustered بر روی جدول ایجاد می‌کنید کلید ایندکس در فضایی دیگری جدای از فضای جدول مرتب شده و مورد استفاده قرار می‌گیرد. به طور کلی در SQL Server می‌توان تا ۹۹۹ ایندکس از نوع NonClustered را ایجاد کرد.

 

• XML Index : این نوع ایندکس‌ها بر روی داده‌هایی  که در قالب ساختار XML هستند ایجاد می‌شود.

 

• Spatial Index : این نوع ایندکس‌ها بر روی داده‌هایی که از نوع جغرافیایی هستند ایجاد می‌شود.

 

• Column Stored Index : نوع جدیدی از ایندکس‌ها هستند که در SQL Server 2012 معرفی شده‌اند که سرعت دسترسی به داده‌ها در آن بیش از سایر ایندکس‌ها می‌باشد.

۵- آشنایی با مفهوم Execution Plan : Plan اجرایی یا نقشه اجرایی کوئری ترتیب اجرای فیزیکی دستورات را مشخص می‌نماید. زمانیکه شما کوئری را اجرا می‌کنید SQL Server آن را به همان ترتیبی که نوشته شده است اجرا نمی‌کند. بلکه ترتیب دسترسی به داده‌های موجود در جداول با توجه به پارامترهای مختلف مانند وضعیت ایندکس‌ها، وضعیت منابع سرور و…  خواهد بود.

پس از مشخص شدن ترتیب اجرای فیزیکی SQL Server نقشه آن را با عنوان Execution Plan ذخیره می‌کند تا در آینده بتواند از آن استفاده کند. چنانچه بخواهید نقشه اجرایی با Execution Plan یک کوئری را مشاهده نمایید کافی است که کوئری مورد نظر خود را Highlight نموده و کلید Ctrl+L را فشاره دهید تا Estimate Plan یا نقشه اجرایی تخمینی برای شما نمایش داده شود.

در تصویر زیر نمونه‌ای از Execution Plan یک کوئری نمایش داده شده است.

SELECT * FROM Orders O
 INNER JOIN [Order Details] OD ON O.OrderID=OD.OrderID
 INNER JOIN Employees E ON O.EmployeeID=E.EmployeeI

نکته : Execution Plan از سمت راست به چپ و از بالا به پایین خوانده می‌شود.

آشنایی با انواع ساختارهای رایج ذخیره‌سازی داده‌ها در SQL Server

زمانیکه شما جدولی در SQL Server ایجاد می‌کنید. داده‌های موجود در این جدول در قالب Pageهایی ذخیره می‌شوند. ساختار قرار گیری این Pageها می‌تواند به دو حالت زیر باشد.

۱- Row Store : در این ساختار داده‌ها به شکل سطری یا Row Based در Pageها ذخیره می‌شوند. در SQL Server ساختار ذخیره‌سازی Row Store به دو حالت زیر می‌باشد.

۱٫۱٫ Heap : به طور خیلی ساده جدولی که فاقد Clustered Index باشد به آن Heap می‌گویند. زمانیکه یک جدول به صورت Heap باشد رکوردهای موجود در آن دارای نظم و ترتیب نبوده و اگر حجم رکوردهای این نوع جداول زیاد باشد کارایی بانک اطلاعاتی به شدت پایین می‌آید.

فرض کنید جدولی به شکل زیر دارید.

CREATE TABLE Employees
(
 EmployeeID INT,
 FirstName NVARCHAR(50),
 LastName NVARCHAR(50)
)
این جدول به شکل Heap بوده و زمانیکه شما تعدادی رکورد در جدول وارد کنید رکوردهای موجود در آن به شکل Row Based (سطری) در Pageهای مربوط به جدول ذخیره می‌شوند.

لازم به ذکر است رکوردهای موجود در جدول دارای نظم و ترتیب خاصی نمی‌باشند و به ترتیب درج به انتهای Pageهای مربوط به جدول اضافه می‌شوند. همچنین مطابق شکل فیلدهای مربوط به هر رکورد در یک Page یکسان ذخیره شده‌اند.

 

۱٫۲٫ Clustered : در صورتیکه یک جدول به شکل Clustered باشد رکوردهای موجود در آن دارای نظم و ترتیب است. رکوردهای موجود در جدولی که به شکل Clustered می‌باشد بر اساس Clustered Key و یا کلید ایندکس می‌باشد.

جدول زیر را در نظر بگیرید.

CREATE TABLE Employees
(
 EmployeeID INT PRIMARY KEY CLUSTERED,
 FirstName NVARCHAR(50),
 LastName NVARCHAR(50)
)
این جدول به شکل Clustered بوده و زمانیکه شما تعدادی رکورد در جدول وارد کنید رکوردهای موجود در آن به شکل Row Based (سطری) در Pageهای مربوط به جدول ذخیره می‌شوند.
NikAmooz.com