آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

Eliminating bookmark (key/rid) lookups

دوره های مرتبط با این مقاله

Eliminating bookmark (key/rid) lookups

وقتی بخش مربوط به اسکن ایندکس و اسکن جدول را بررسی می کردیم، قادر به حذف اسکنی بودیم که توسط یک Index Seek جایگزین شده بود، اما این امر نیز یک Key Lookup معرفی کرد که مورد دیگری است که ممکن است تمایل به حذف آن برای بهبود اجرا داشته باشید.

یک key lookup زمانی اتفاق می افتد که یک داده درnon-clustered index یافت شود، اما یک داده ی اضافه ازclustered index برای کامل کردن query لازم است که در نتیجه یک lookup اتفاق می افتد. اگر جدول clustered index نداشته باشد، به جای آن یک RID Lookup اتفاق می افتد.

در این بخش به چگونگی یافتن Key/RID Lookups و روش های حذف آن می پردازیم.

توضیح:

دلیل حذف Key/RID Lookups این است که آنها برای یافتن داده به یک عملکرد اضافه و یا ممکن است به یک I/O اضافه نیاز داشته باشند. I/O یکی از بزرگترین عملکردها روی سرور می باشد و راه حذف و یا تنزل I/O اجرای مجدد آن است.

اجازه بدهید نگاهی به مثالی مربوط به query و برنامه ی query داشته باشیم. قبل از انجام این کار می خواهیم یک nonclustered index روی LastName اضافه کنیم.

        
USE [AdventureWorks]‎
GO
CREATE NONCLUSTERED INDEX [IX_LastName]‎
ON [Person].[Contact] ([LastName])‎
GO

اکنون می توانیم از Ctrl+M برای روشن کردن طرح اجرایی (execution plan) حقیقی و اجرای the select استفاده کنیم.

SELECT * FROM Person.Contact WHERE LastName = 'Russell'‎

اگر به طرح اجرایی دقت کنیم متوجه می شویم که یک Index Seek داریم که از ایندکس جدید استفاده می کند، اما یک Key Lookup روی clustered index هم داریم. دلیلش این است که nonclustered index فقط حاوی ستون LastName می شود، اما از آنجایی که ما در حال انجام یک SELECT * می باشیم، query باید ستون های دیگر را از clustered index بگیرد و بنابراین ما دارای یک Key Lookup هستیم. اپراتور دیگری که داریم، Nested Loops می باشد که نتایج Index Seek و Key Lookup را با یکدیگر یکی می کند.

آموزش SQL Server

بنابراین اگر query را مانند زیر تغییر دهیم و این برنامه را دوباره اجرا کنیم، مشاهده می کنید که Key Lookup از بین می رود، زیرا ایندکس دارای همه ی ستون ها می باشد.

SELECT LastName FROM Person.Contact WHERE LastName = 'Russell'‎

در اینجا مشاهده می کنیم که دیگر Key Lookup و نیز اپراتور Nested Loops وجود ندارد.

آموزش SQL Server

اگر هر دو query را همزمان در یک batch اجرا کنیم، شاهد پیشرفت با حذف این دو اپراتور خواهیم بود.

SELECT * FROM Person.Contact WHERE LastName = 'Russell'‎
SELECT LastName FROM Person.Contact WHERE LastName = 'Russell'‎

در تصویر زیر مشاهده می کنیم که وضعیت اول 99 درصد بسته و وضعیت دوم 1 درصد آن را می گیرد، بنابراین این امر یک پیشرفت خیلی بزرگ می باشد.

آموزش SQL Server

از آنجایی که ایندکس حاوی LastName می باشد که تنها ستونی است که برای ستون های SELECTed و عبارت WHERE استفاده می شود، ایندکس می تواند کل query را کنترل کند. مورد دیگری که باید نسبت به آن آگاه باشید، این است که اگر جدول دارای clustered index باشد، می توانیم ستون یا ستون های clustered index را بدون انجام Key Lookup وارد کنیم.

جدول Person.Contact دارای یک clustered index روی ContactID می باشد، بنابراین اگر بخواهیم را وارد query کنیم، می توانیم تنها یک Index Seek انجام دهیم.

SELECT ContactID, LastName FROM Person.Contact WHERE LastName = 'Russell'‎

در اینجا مشاهده می کنیم که تنها مورد لازم برای انجام یک Index Seek وارد کردن هردوی این ستون هاست.

آموزش SQL Server

بنابراین خوب است که تنها کار لازم همین باشد، اما اگر نیاز باشد ستون های دیگری مانند FirstName را وارد کنید، چطور! اگر query را مانند زیر تغییر دهیم، Key Lookup مجددا باز می گردد.

SELECT ContactID, LastName FROM Person.Contact WHERE LastName = 'Russell'‎

خوشبختانه گزینه های کمی برای رسیدگی به این امر وجود دارد.

Creating a Covering Index

یک covering index اساسا همان کاری را اکجام می دهد که به طور ضمنی به آن اشاره دارد، این برنامه یک query را با وارد کردن همه ی ستون های مورد نیاز پوشش می دهد. بنابراین اگر همیشه لازم داریم FirstName و LastName را وارد کنیم، می توانیم برای وترد کردن هردوی آنها ایندکس خود را مانند زیر اصلاح کنیم.

DROP INDEX [IX_LastName] ON [Person].[Contact]‎
GO
CREATE NONCLUSTERED INDEX [IX_LastName]‎
ON [Person].[Contact] ([LastName], [FirstName])‎
GO

و اگر به طرح اجرایی دقت کنیم، متوجه خواهیم شد که بار دیگر Key Lookup را حذف کرده ایم.

آموزش SQL Server

گزینه ی دیگر استفاده از ستون های شامل ویژگی برای یک ایندکس می باشد. این امر به شما اجازه ی وارد کردن ستون های اضافه میدهد، بنابراین با ایندکس ذخیره می شوند، اما بخشی از درخت ایندکس نمی باشند. این امر به شما اجازه ی استفاده از ویژگی های پوشش ایندکس و کاهش نیازهای ذخیره سازی در درخت ایندکس را می دهد. مزیت دیگر این است که می توانید انواع داده ی اضافه را که بخشی از پوشش ایندکس نمی باشد، اضافه کنید.

ترکیب ایندکس با ستون های مشمول مانند زیر می باشد:

                            
DROP INDEX [IX_LastName] ON [Person].[Contact]‎
GO
CREATE NONCLUSTERED INDEX [IX_LastName]‎
ON [Person].[Contact] ([LastName]) ‎
INCLUDE ([FirstName])‎
GO

در اینجا می بینیم که طرح اجرایی برای هر دو گزینه یکی می باشد.

آموزش SQL Server
  • 1746
  •    574
  • تاریخ ارسال :   1394/07/27

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .