رخی از دادهها از ترکیب و ادغام شدن چند داده دیگر بدست میآیند. مثلا
شماره دانشجویی از ترکیب چند صفت مختلف بوجود میآید (مثل نیمسال ورودی،
کددانشگاه، کدرشته تحصیلی...).
برای پیاده سازی اینگونه ستونها SQL Server یک قابلیتی به نام computed column
ارائه داده است. برای تعریف این چنین ستون هایی بعد از نام ستون از کلمه
AS استفاده میکنیم. عبارتی که ستون محاسباتی را تشکیل میدهد میتواند
شامل این موارد باشد: تابع، نام ستون غیر محاسباتی و مقادیر ثابت ولی امکان
استفاده از subquery وجود ندارد.
ستونهای محاسباتی بطور پیشفرض مجازی هستند (بطور فیزیکی بر روی دیسک ذخیره
نشده اند). یعنی هر موقع که query اجرا میشود آنها نیز مجدد محاسبه شده و
نمایش داده میشوند.
برای اینکه نوع ذخیره سازی را از مجازی به فیزیکی تبدیل کنیم باید در هنگام
ساخت جدول (یا تغییر آن) از کلید واژه PERSISTED استفاده کنیم. وقتی بطور
فیزیکی ذخیره شده باشد با هر بار ویرایش یکی از ستونهای تشکلیل دهنده ستون
محاسباتی هم ویرایش میشود.
ستون محاسباتی بعد از تبدیل شدن از مجازی به فیزیکی میتواند به عنوان کلید اولیه و ایندکس در نظر گرفته شود.
به مثال زیر توجه کنید:
جدولی داریم با دو ستون، قرار هست بر اساس ترکیب مقادیر دو ستون جستجویی
انجام دهیم. ضمن اینکه ترکیب دو ستون باید منحصر بفرد باشد. برای این منظور
یک unique index روی دو ستون لحاظ میکنیم.
createtable t1
(
col1 char(1),
col2 char(1)
)
createunique nonclustered index ix_uq on t1 (col1 , col2);
اکنون به دنبال سطری میگردیم که ترکیب مقادیر دو ستون آن برابر با OP باشد. پس query زیر را اجرا میکنیم
select col1 + col2
from t1
where col1 + col2 = 'OP'
اما همانطور که در تصویر زیر مشاهده میشود عمل Index Seek صورت نگرفته
است. زمانی که از ستون به عنوان یک عبارت استفاده شود Index Seek نخواهیم
داشت. منظور عبارت، الحاق مقداری با ستون، قرار گرفتن ستون در یک تابع و
... میباشد.
برای اینکه Index Seek داشته باشیم بایستی مقادیر را جداگانه مقایسه کنیم(ستونها به صورت عبارت محاسباتی نباشند)
با دستور اول یک ستون محاسباتی از نوع persisted به جدول اضافه نمودیم. و با دستور دوم یک Index روی ستون محاسباتی ایجاد نمودیم.
حال مجددا عمل جستجو را انجام میدهیم ولی به کمک ستون محاسباتی که اخیرا ایجاد نمودیم:
select *
from t1
where col3 = 'OP';
حالا مشاهده میشود که شاخص ix1 اسکن نشده است. و از آنجایی که شاخص از نوع Clustered است مشکل Covering هم نخواهیم داشت.