SQL SERVER 2008

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

چگونگی به روز رسانی جداول در نسخه جدید
ساعت ۱٢:٤٢ ‎ب.ظ روز ۱۳۸٧/۱۱/٢٦  کلمات کلیدی: re-creation ، design view ، sql server 2008 ، saving change is not permitted

یکی از خصوصیات جدیدی که به SQL Server 2008 افزوده شده است این است که به صورت پیش فرض اجازه تغییر در ساختار جداول از طریق Desgin View داده نمیشود. این خصیصه به خاطر این اضافه شده که از تغییرات تصادفی روی DB Server ها جلوگیری کند. خصیصه جدید ممکن است مقداری برای توسعه دهندگان دردسر آفرین باشد زیرا اگر بخواهند تغییر خود را اعمال کنند با خطای زیر مواجه میشوند :

خطای حاصل از تغییر ساختار جدول در SQL Server 2008

 

برای رفع این مشکل توسعه دهندگان باید این خصوصیت را از مسیر ارائه شده در زیر غیر فعال کنند :

Tools > Options > Designers > Table and Database Designers > Prevent saving changes that require table re-creation

از کار انداختن خصیصه مربوطه

حال شما میتوانید جدول مورد نظر خود را ویرایش کنید.


 
اندیسهای فیلتر شده و آمار
ساعت ۳:۳٥ ‎ب.ظ روز ۱۳۸٧/۱۱/۸  کلمات کلیدی: 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 داشته باشند.