برخی از دادهها از ترکیب و ادغام شدن چند داده دیگر بدست میآیند. مثلا شماره دانشجویی از ترکیب چند صفت مختلف بوجود میآید (مثل نیمسال ورودی، کددانشگاه، کدرشته تحصیلی...).
برای پیاده سازی اینگونه ستونها SQL Server یک قابلیتی به نام computed column ارائه داده است. برای تعریف این چنین ستون هایی بعد از نام ستون از کلمه AS استفاده میکنیم. عبارتی که ستون محاسباتی را تشکیل میدهد میتواند شامل این موارد باشد: تابع، نام ستون غیر محاسباتی و مقادیر ثابت ولی امکان استفاده از subquery وجود ندارد.
ستونهای محاسباتی بطور پیشفرض مجازی هستند (بطور فیزیکی بر روی دیسک ذخیره نشده اند). یعنی هر موقع که query اجرا میشود آنها نیز مجدد محاسبه شده و نمایش داده میشوند.
برای اینکه نوع ذخیره سازی را از مجازی به فیزیکی تبدیل کنیم باید در هنگام ساخت جدول (یا تغییر آن) از کلید واژه PERSISTED استفاده کنیم. وقتی بطور فیزیکی ذخیره شده باشد با هر بار ویرایش یکی از ستونهای تشکلیل دهنده ستون محاسباتی هم ویرایش میشود.
ستون محاسباتی بعد از تبدیل شدن از مجازی به فیزیکی میتواند به عنوان کلید اولیه و ایندکس در نظر گرفته شود.
به مثال زیر توجه کنید:
جدولی داریم با دو ستون، قرار هست بر اساس ترکیب مقادیر دو ستون جستجویی انجام دهیم. ضمن اینکه ترکیب دو ستون باید منحصر بفرد باشد. برای این منظور یک unique index روی دو ستون لحاظ میکنیم.
اکنون به دنبال سطری میگردیم که ترکیب مقادیر دو ستون آن برابر با OP باشد. پس query زیر را اجرا میکنیم
اما همانطور که در تصویر زیر مشاهده میشود عمل Index Seek صورت نگرفته است. زمانی که از ستون به عنوان یک عبارت استفاده شود Index Seek نخواهیم داشت. منظور عبارت، الحاق مقداری با ستون، قرار گرفتن ستون در یک تابع و ... میباشد.
برای اینکه Index Seek داشته باشیم بایستی مقادیر را جداگانه مقایسه کنیم(ستونها به صورت عبارت محاسباتی نباشند)
ولی ما میخواهیم شرط بر اساس ترکیب دو ستون باشد. خب اینجا هست که Computed Columns مطرح میشوند.
با دستور اول یک ستون محاسباتی از نوع persisted به جدول اضافه نمودیم. و با دستور دوم یک Index روی ستون محاسباتی ایجاد نمودیم.
حال مجددا عمل جستجو را انجام میدهیم ولی به کمک ستون محاسباتی که اخیرا ایجاد نمودیم:
حالا مشاهده میشود که شاخص ix1 اسکن نشده است. و از آنجایی که شاخص از نوع Clustered است مشکل Covering هم نخواهیم داشت.
برای پیاده سازی اینگونه ستونها SQL Server یک قابلیتی به نام computed column ارائه داده است. برای تعریف این چنین ستون هایی بعد از نام ستون از کلمه AS استفاده میکنیم. عبارتی که ستون محاسباتی را تشکیل میدهد میتواند شامل این موارد باشد: تابع، نام ستون غیر محاسباتی و مقادیر ثابت ولی امکان استفاده از subquery وجود ندارد.
ستونهای محاسباتی بطور پیشفرض مجازی هستند (بطور فیزیکی بر روی دیسک ذخیره نشده اند). یعنی هر موقع که query اجرا میشود آنها نیز مجدد محاسبه شده و نمایش داده میشوند.
برای اینکه نوع ذخیره سازی را از مجازی به فیزیکی تبدیل کنیم باید در هنگام ساخت جدول (یا تغییر آن) از کلید واژه PERSISTED استفاده کنیم. وقتی بطور فیزیکی ذخیره شده باشد با هر بار ویرایش یکی از ستونهای تشکلیل دهنده ستون محاسباتی هم ویرایش میشود.
ستون محاسباتی بعد از تبدیل شدن از مجازی به فیزیکی میتواند به عنوان کلید اولیه و ایندکس در نظر گرفته شود.
به مثال زیر توجه کنید:
جدولی داریم با دو ستون، قرار هست بر اساس ترکیب مقادیر دو ستون جستجویی انجام دهیم. ضمن اینکه ترکیب دو ستون باید منحصر بفرد باشد. برای این منظور یک unique index روی دو ستون لحاظ میکنیم.
create table t1 ( col1 char(1), col2 char(1) ) create unique nonclustered index ix_uq on t1 (col1 , col2); insert t1 values('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E'), ('E', 'F'), ('G', 'H'), ('I', 'J'), ('K', 'L'), ('M', 'N'), ('O', 'P');
اکنون به دنبال سطری میگردیم که ترکیب مقادیر دو ستون آن برابر با OP باشد. پس query زیر را اجرا میکنیم
select col1 + col2 from t1 where col1 + col2 = 'OP'
برای اینکه Index Seek داشته باشیم بایستی مقادیر را جداگانه مقایسه کنیم(ستونها به صورت عبارت محاسباتی نباشند)
select col1 + col2 from t1 where col1 = 'O' and col2 = 'P'
ولی ما میخواهیم شرط بر اساس ترکیب دو ستون باشد. خب اینجا هست که Computed Columns مطرح میشوند.
alter table t1 add col3 as col1 + col2 persisted create clustered index ix1 on t1 (col3)
حال مجددا عمل جستجو را انجام میدهیم ولی به کمک ستون محاسباتی که اخیرا ایجاد نمودیم:
select * from t1 where col3 = 'OP';
حالا مشاهده میشود که شاخص ix1 اسکن نشده است. و از آنجایی که شاخص از نوع Clustered است مشکل Covering هم نخواهیم داشت.