ALTER DATABASE dataBase_Name SET QUERY_STORE = ON;
ALTER DATABASE dataBase_Name SET QUERY_STORE = ON;
در بسیاری از جداول بانکهای اطلاعاتی، اغلب داده هایی که مورد جستجو و بازیابی قرار می گیرند، داده هایی هستند که اخیراً ذخیره شده اند و به ندرت به داده هایی مثلا با قدمت یکسال پیش نیاز داریم.
بنابراین بسیار عقلانی به نظر میرسد که داده های قدیمی را جدا از داده های جدید نگه داریم تا سرعت بازیابی و جستجو و درج اطلاعاتمان بالا رود. از طرفی با ایجاد یک مکانیزم بهینه، کاری کنیم که در صورت جستجوی داده های قدیمی تر، آنها نیز در نتایج ظاهر شوند و کاربر متوجه تفکیک این دو بخش (داده های قدیمی، داده های جدید) نشود.
مایکروسافت در نسخه جدید اس کیو ال سرور یعنی SQL Server 2016 این امکان را به مجموعه امکانات خود اضافه کرده است و از سرویس ابری و آنلاین آژور Azure برای ذخیره داده های قدیمی و از سیستم محلی کاربر برای داده های جدید استفاده می کند. نکته جالب ماجرا اینجاست که با فعال کردن این قابلیت که StretchDB نام دارد و ساخت یک حساب کاربری در سرویس ابری آژور، عملیات انتقال داده ها به سرور آژور به صورت خودکار توسط خود اسکیو ال سرور انجام میگیرد و بازیابی اطلاعات هم به صورت خودکار صورت می پذیرد.
منبع: سایت مهندسی داده
دسته (Batch):مجموعه ی از یک یا چند دستور T-SQL که همواره همراه با هم به سرور ارسال می شوند که هر دسته از دستورات با هم ترجمه و بدنبال هم اجرا میشوند. چنانچه یک دسته ،شامل چندین دستور باشد.
تمام مراحل بهینه سازی لازم روی مجموعه ی این دستورات انجام می شود و پلن اجرائی (Execution plan) بر مبنای مجموعه دستورات موجود در دسته ،تعیین می گردد.
چند نمونه از دسته ها
۱- همه دستورات موجود در یک تریگر یک دسته محسوب می شود.
۲-رشته ای که توسط یک فرمان EXECUTE اجرا می شود، یک دسته محسوب می شود.
قواعد کار با دسته ها
دستور CREATE در هرجائی بجزء در اولین دستور یک دسته قرار می گیرد، همه دستوراتی که در یک دسته، پس از این دستور قرار می گیرند بعنوان بخشی از همان دستور در نظر گرفته میشوند.
اگر در یک دسته ، ساختار یک جدول تغییر داده شود ، نمی توان در همان دسته از ستونهای جدید استفاده کرد.
اگر دستور EXECUTE اولین دستور یک دسته باشد می توان از نوشتن کلمه کلیدی EXECUTE خود داری کرد.
چگونگی اجرای دسته ها
در هر مرحله ارسال دسته ای از دستورات به سرور ،سروردر پنج مرحله آنها را مورد بررسی و پردازش قرار می دهد که این مراحل به شرح زیر می باشد :
۱-تفکیک نگارشی: دستورات دریافتیاز نظر املا مورد بررسی قرار می گیرند.
۲- تفکیک ارجاعی: اشیاء مورد ارجاء بررسی می شوند تا از وجود آنها و وجود مجوز دسترسی به آنها برای کاربر اطمینان حاصل شود.
۳- بهینه سازی : طرح اجرای مناسب برای رسیدن به سریعترین مسیر اجرای دستورات را پیدا می کند.
۴- ترجمه :طرح اجرایی ترجمه می شود.
۵- اجرا: طرح ترجمه شده توسط سرور اجرا می شود.
نکته پایانی
قرار دادن تعداد زیادتری دستور در یک دسته ،سرعت اجرای دستورات توسط سرور را افزایش می دهد . زیرا ضمن کاهش عملیات I/O امکان بهینه سازی یهتر نیز بوجود می آید.
منبع: nikamooz.com
نسخه SQL Server Enterprise چند امکانات داخلی منصر به فرد دارد که توانایی بالا برای بازدهی سریع در سیستم هایی با تراکنشهای بالا و پردازشهای سنگین را دارد. به عنوان مثال سیستمهای «خرید آنلاین» یا «پایانه های فروش» یا سیستمهای گزارشگیری و آنالیزی مانند Credit Reference Information System برای بانکها و بیمه ها که این امکانات و قابلیتهای پنهان در SQL Server Standard Edition موجود نمی باشد.
متاسفانه مسعولان فروش در شرکت مایکروسافت ( به عنوان مثال مایکروسافت مالزی و سنگاپور) تماما در مورد امکانات ظاهری و کلی صحبت می کنند به عنوان مثال در نسخه Enterprise چند پردازنده قابل استفاده است و یا حداکثر حافظه و قابلیتهایی مانند Business Intelligence, High Availability و البته هزینه خرید هر لایسنس برای یک پردازنده فیزیکی ( قیمت هر لایسنس برای Enterprise حدود ۲۶ هزار دلار آمریکا است) اما متاسفانه در یک سوی قضیه مشتری است که هیچ دانشی از امکانات این نرم افزار ندارد و فقط دنبال این است که هزینه لایسنس ها را تا حداکثر پایین بیاورد ولی به چه قیمت ؟ به قیمت اینکه در تراکنشهای بالا سرعت بازدهی پایین آید و امکان از دست دادن مشتریان فراهم شود؟ (البته تمامی این مثالهای در ایران قابل اجرا نیست به هزار و یک دلیل)
برای ایجاد Column Stored Index ابتدا باید فیلدهای شرکت کننده در ایندکس را تعیین و پس از آن ایندکس را ایجاد نمایید. مثال زیر نحوه انجام اینکار را نمایش میدهد.
۱- برای شروع کار یک جدول جدید ایجاد میکنیم. این جدول دارای یک Primary Key است که با استفاده از Clustered Index ایجاد شده است. بدلیل اینکه جداول شما از قبل وجود دارند ممکن است این مرحله جزء کار شما نباشد.
USE tempdb
GO
IF OBJECT_ID(
'Employees'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
Employees
GO
CREATE
TABLE
Employees_ColumnBased
(
Code
INT
IDENTITY
CONSTRAINT
PK_Code
PRIMARY
KEY
,
FirstName NVARCHAR(50),
LastName NVARCHAR(80),
HireDate SMALLDATETIME,
City NVARCHAR(20)
)
GO
INSERT
INTO
Employees_ColumnBased (FirstName,LastName,HireDate,City)
VALUES
(N
'مسعود'
,N
'طاهری'
,
'۲۰۰۰-۰۱-۰۱'
,N
'میانه'
),
(N
'فرید'
,N
'طاهری'
,
'۲۰۰۳-۰۱-۰۱'
,N
'میانه'
),
(N
'احمد'
,N
'غفاری'
,
'۲۰۰۳-۰۱-۰۱'
,N
'میانه'
),
(N
'خدیجه'
,N
'افروزنیا'
,
'۲۰۰۰-۰۱-۰۱'
,N
'تهران'
),
(N
'مجید'
,N
'طاهری'
,
'۲۰۰۵-۰۱-۰۱'
,N
'تهران'
)
GO
INSERT
INTO
Employees_ColumnBased (FirstName,LastName,HireDate,City)
SELECT
FirstName,LastName,HireDate,City
FROM
Employees_ColumnBased
GO 10
CREATE
NONCLUSTERED COLUMNSTORE
INDEX
IX_ColumnStore
ON
Employees_ColumnBased(FirstName,LastName,HireDate)
GO
نکته مهمی که باید در ایجاد این نوع از ایندکسها در نظر گرفت این است که به دلیل افزایش Performance معمولاً در بیشتر مواقع این ایندکسها با توجه به کوئریهای شما ایجاد میگردند. بدین صورتکه
۴- در صورتیکه بخواهید Column Stored Index را به صورت ویژوالی در Management Studio ایجاد کافی است مراحل زیر را انجام دهید.
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 میتواند شامل تصویر داده قبل و بعد از تغییر داده و همچنین زمان انجام کار و… باشد.
۳- آشنایی با مفهوم Index در 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 از سمت راست به چپ و از بالا به پایین خوانده میشود.