PDA

View Full Version : عدم کاهش حجم Tableپس از حذف کلی Field و Index



A.Farzin
پنج شنبه 09 اسفند 1386, 17:17 عصر
با سلام

جدولی محتوی 11 میلیون رکورد اطلاعات داشتم که حدود 60 Field داشت. با این شرایط، حجم این جدول چیزی حدود 18GB بود.
از این جدول حدود 15 فیلد با دیتاتایپ int و همچنین 15 ایندکس مربوط به آنها را حذف کردم. ولی حجم دیتابیس تغییر چندانی نشان نداد. کل Database را Shirink کردم باز هم حجم همچنان بالاست.
سئوال این است که بالاخره حذف این 15 تا فیلد و 15 ایندکس یک فضائی را باید آزاد کند. چرا حجم کاهش نیافته است.
تصویر فضای جدول بعد از شیرینک پیوست است

AminSobati
جمعه 10 اسفند 1386, 21:32 عصر
Clustered Index جدول رو Rebuild کنید

A.Farzin
دوشنبه 13 اسفند 1386, 23:36 عصر
Clustered Index جدول رو Rebuild کنید

با تشکر و ارادت

1) در EM اقدام به unSet کردن Primary key کردم؛
2) خواستم تعریف دوباره CLUSTERED INDEX را از طریق همان EM و به کمک کلید Set Primary key انجام دهم ولی دیدم که ایندکسهای تعریف شده بدین شکل را در کادر properies مربوط به Index/Key به عنوان یک Unique Constrant نشان میدهد نه یک unique index، برای ایجاد مجدد ایندکس به شکل زیر یک CLUSTERED INDEX عمل کردم.

CREATE UNIQUE CLUSTERED INDEX IDX_PK ON MYTABLE(ID)
نتیجه کار:
در نتیجه این کار علاوه بر اینکه حجم Database کاهش بسیار زیادی یافت، سرعت اجرای Queryها هم بهبود قابل توجهی پیدا کرد.
نتیجه اخلاقی:
آیا نوع ایندکس تعریف شده باعث بهبود سرعت واکشی کوئریها شده است یا اینکه اگر با استفاده از کلید Set Primary key هم یک PK_Index ایجاد میکردم باز هم بهبود سرعت اتفاق می‌افتاد؟

بسیار سپاسگزار

AminSobati
سه شنبه 14 اسفند 1386, 19:57 عصر
من اطلاع کافی در مورد وضعیت جدول شما ندارم. اما احتمال میدم این جدول بر اثر ویرایشهای زیاد، دچار Fragmentation قابل توجهی شده بوده که الان برطرف شده. تاکید میکنم این فقط یک حدس هستش. باید Execution Plan مربوط به Queryها رو قبل و بعد از Rebuild کردن ایندکس دید تا نظر قطعی داد. به هر حال خوشحالم که مشکل برطرف شده!

poorias7a
سه شنبه 18 اسفند 1388, 12:26 عصر
با سلام

چطور تعدا زیادی index را با هم rebuild کنم
با تشکر

A.Farzin
چهارشنبه 19 اسفند 1388, 08:05 صبح
براي 2000 اينجوري

USE DatabaseName
exec sp_msforeachtable 'DBCC DBREINDEX ( ''?'') WITH NO_INFOMSGS'
GO
براي 2005 و بالاتر هم اينجوري

USE DatabaseName
exec sp_msforeachtable 'alter index all on ? rebuild'
GO
در ضمن اين نكته را هم در نظر داشته باش كه ساخت مجدد ايندكسهاي موجود، به همان شكل قبلي آن معمولاً نبايد به كاهش حجم منجر شود.
براي اين منظور بهتر است ببينيم تغيير در ايندكسها چونه بايد باشد كه هم Performance حفظ شود و هم كاهش حجم داشته باشيم.
اينجا را هم ببين http://www.barnamenevis.org/forum/showthread.php?t=185454&highlight=DBREINDEX