SQL SERVER 2008

تجارب من در رابطه با SQL SERVER

اندیسهای فیلتر شده و آمار
ساعت ۳:۳٥ ‎ب.ظ روز ۱۳۸٧/۱۱/۸  کلمات کلیدی: sql server 2008 ، nonclustered index ، اندیسهای فیلتر شده

SQL Server 2008 اندیسهای فیلتر شده و آمار را معرفی کرد. شما اکنون میتوانید یک اندیس گروهبندی نشده بر اساس یک گزاره بسازید، و فقط زیرمجموعه ای از سطرها برای اینکه گزاره در اندیس B-Tree ذخیره شده صحیح بماند، موجودند. به همین نحو، شما میتواند به صورت دستی بر اساس یک گزاره آمار بسازید. بهینه ساز برای زمانی که چنین اندیسهای فیلتر شده و آماری به صورت منطقی استفاده میشوند مفید هستند.
اندیسهای فیلترشده با طراحی خوب میتوانند کارایی و کیفیت طرح را بالا ببرند زیرا آنها از اندیسهای فیلتر نشده کوچکترند. همچنین، آمار فیلتر شده – خواه به صورت خودکار برای یک اندیس فیلتر شده ساخته شده باشد خواه به صورت دستی – از آمار فیلترنشده دقیقترند زیرا آنها نیاز دارندتنها زیرمچموعه ای از سطرهای جدول را کاور کنند.
شما همچنین میتوانید هزینه نگهداری اندیس را به دلیل موجود بودن اطلاعات کمتر جهت نگهداری در اندیسهای فیلتر شده کاهش دهید. این شامل تغییرات در اندیس، بازسازیهای اندیس، و هزینه به روزرسانی آمار میشود. اندیسهای فیلتر شده همچنین به صورت واضح هزینه های storage را کم میکند.
اجازه بدهید نگاهی به چند مثال درباره اندیسهای فیلتر شده بیندازیم. کد زیر یک اندیس روی CurrancyRateID در جدول Sales.SalesOrderHeader میسازد که فیلتر آن نمیگذارد NULL ها وارد شوند :


USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX idx_currate_notnull
  ON Sales.SalesOrderHeader(CurrencyRateID)
  WHERE CurrencyRateID IS NOT NULL;


نظر به فیلترهای query ، کنار گزاره  IS NULL  که به صریحا به دنبال مقادیر NULL میگردد، تمام گزاره های دیگر NULL ها را رد میکنند، بنابراین بهینه ساز میفهمد که پتانسیل اینکه از اندیس استفاده شود وجود دارد. برای مثال، طرح query زیر نشان میدهد که اندیس استفاده شده است :


SELECT *
FROM Sales.SalesOrderHeader
WHERE CurrencyRateID = 4;

ستون CurrencyRateID درصد زیادی از NULL ها را در خود دارد، بنابراین این اندیس اساسا حافظه کمتری برای ذخیره کردن نسبت به یک اندیس فیلتر نشده در یک ستون مشابه مصرف میکند. شما همچنین میتوانید از این چنین اندیسهایی در ستونهای sparse استفاده کنید.
کد زیر یک اندیس فیلتر نشده روی ستون Freight میسازد، سطرهایی که مقدار Freght در آنها بزرگتر یا مساوی 5000.00 باشد فیلتر میشوند :


CREATE NONCLUSTERED INDEX idx_freight_5000_or_more
  ON Sales.SalesOrderHeader(Freight)
  WHERE Freight >= 5000.00;


بهینه ساز ملاحظه میکند استفاده یک اندیس وقتی فاصله فرعی یک اندیس ورودی فیلتر شده مورد نیاز است آن را فیلتر میکند :


SELECT *
FROM Sales.SalesOrderHeader
WHERE Freight BETWEEN 5500.00 AND 6000.00;


اندیسهای فیلتر شده همچنین میتوانند به عنوان unique تعریف شوند و یک عبارت INCLUDE داشته باشند.