veniz2008
پنج شنبه 17 اسفند 1391, 16:23 عصر
سلام.
با توجه به اهمیت مبحث ایندکس گذاری صحیح بر روی جداول چند روزی میشه که دنبال یه منبع خوب میگشتم. متاسفانه جستجوی سایت و وب چیزی نصیب من نکرد. بالاخره از روی کتاب Robin Dewson ترجمه عبدالوهاب فخر یاسری شروع به مطالعه کردم. در کل کتاب مفید بود ولی از ترجمه مطلوب فاصله داره. در حین مطالعه کتاب، سوال ها و ابهامات متعددی واسم پیش اومده که بهترین مکان برای رسیدن به جواب سوال هام رو اینجا دیدم.
جواب تعدادی از این سوالات شاید ساده به نظر بیاد ولی بهرحال واسه من مبهم هستن.
تعداد سوالات 15 تا هست و چون همه سوالات مربوط به مبحث ایندکس هست، بهتر دیدم که همه رو در یک تاپیک (به جای چند تاپیک پراکنده) بیارم. قطعا جواب صحیح به این سوالات در آینده به درد بقیه دوستان هم خواهد خورد. دوستان به هر کدوم از سوالات که اطلاع دارند ممنون میشم توضیح مناسب و کافی رو بدن. پیشاپیش از همه دوستان تشکر میکنم.
اما سوالات :
1. با توجه به اینکه ایندکس بر روی تعداد داده های زیاد مفهوم و کارایی واقعی خودش رو نشون میده، این تعداد رکورد رو چطور باید تشخیص داد؟. یعنی چطور بفهمیم که یک جدول به ایندکس نیاز داره؟.
2. در نرم افزارهایی که بصورت شبکه می سازیم و دیتابیس رو بر روی سیسیتم سرور قرار میدهیم،چون ایندکس ها نیاز به پردازش و جابه جایی رکوردها یا بروزرسانی مداوم آمار خود هستند. مشخصات سخت افزاری سرور باید حداقل به چه صورتی باشه؟ (حدودا برای 10 کلاینت فرض کنید و چند حالت مختلف رو از نظر فشار وارده بر سرور از طرف کلاینت ها در نظر بگیرید).
3. در تعیین نوع ایندکس (دسته ای و غیردسته ای)، آیا اولویتی وجود داره یا طبق شرایط نوع فیلدها نوع ایندکس هم تعیین میشه؟. آیا از لحاظ سرعت، بین این دو نوع ایندکس تفاوتی وجود داره؟
4. جدولی رو با تعداد رکورد بالای 1 میلیون در نظر بگیرید که شامل شماره شناسنامه، نام و نام خانوادگی باشه که داده ها بصورت نامرتب درون جدول ذخیره شدن. اگر در برنامه جستجو براساس هم "شماره شناسنامه" انجام بشه و هم "نام و نام خانوادگی". بهترین نوع ایندکس گذاری برای چنین جدولی چی هست؟ (دسته ای یا غیر دسته ای؟)
5. اگر ایندکسی رو بصورت unique تعریف کنیم، آیا اجازه دریافت مقدار null رو داره یا نه؟. اگر داره امکان دریافت دو یا چند ستون null وجود داره یا نه؟
6. استفاده از covering index در چه مواردی کاربرد داره؟. با توجه به اینکه در این حالت، ایندکس بر روی تمامی ستون ها تعریف میشه و در کتاب تاکید شده که ایندکس بر روی بیشتر از 4 ستون خیلی کار درستی نیست.
با توجه به این موضوع، آیا تضادی بوجود نمیاد؟ (بین covering index که روی همه ستون ها تعریف میشه و قرار نگرفتن ایندکس بر روی بیش از 4 ستون)
7. اگر ایندکس بر روی نام خانوادگی (یا کلا هر فیلد فارسی) قرار داشته باشه، آیا در فامیل هایی که با "ی" و "ک" شروع میشن، امکان اشتباه در مرتب سازی وجود داره؟.(همون مشکل همیشگی بین حروف فارسی و عربی)
8. اگر بر روی یک ستون عددی که مقادیر بصورت نامنظم وارد میشوند یک ایندکس دسته ای (clustered index) قرار بگیره. در هنگام درج داده جدید، واسه اینکه رکورد جدید در جای مناسب خودش قرار بگیره، احتمال زیاد نیاز هست که تعداد رکوردهای زیادی شیفت داده بشن تا رکورد جدید در جای مناسب خودش قرار بگیره که این امر باعث کاهش سرعت اجرای درج داده ها میشه. در کتاب گفته شده که برای کاهش تاثیر این کار از sql 2005 به بعد اجازه تعیین عاملی پر کننده به هنگام ایجاد ایندکس وجود داره. من این موضوع رو اصلا درک نکردم.این حرف یعنی چی و کجای تعریف ایندکس باید چنین موردی رو لحاظ کرد؟.
9. ایندکسی رو در نظر بگیرید که بر روی سه ستون شماره شناسنامه، نام و نام خانوادگی ایجاد شده باشه. اگر جستجوی ما فقط براساس شماره شناسنامه یا فقط براساس نام خانوادگی باشه، در چنین حالتی باز هم sql از ایندکس کمک میگیره؟ یا فقط زمانی از ایندکس استفاده میشه که در شرط جستجو، هر سه فیلد قید شده باشند؟
10. با توجه به اینکه ایندکس همیشه مطلوب نیست و بعضی وقت ها نتیجه عکس میده، آیا راهی (یا ابزاری) وجود داره که بتونیم تست کنیم که آیا وجود ایندکس برای اون جدول بهتره یا نداشتن ایندکس؟
11. در چه حالات و شرایطی ممکنه ایندکس خوب دیروز به ایندکس بد امروز تبدیل بشه؟. لطفا در قالب مثال توضیح بدید.
12. فیلدی که در جدول کلید اصلی هست،اگر بر روی آن ایندکس قرار دهیم آیا الزاما باید آنرا یونیک کنیم؟
13. برای بروزرسانی آمار ایندکس از گزینه Statistics Recompute (یا Statistics NoRecompute ) استفاده میشه. در چه مواردی باید این گزینه رو بر روی on و درچه مواردی بر روی off تنظیم کرد؟
14. برای فشردن ایندکس و از بین بردن فضای ایجاد شده در دیسک، گفته شده با استفاده از دستور Drop Existing ، ایندکس رو مجددا ایجاد کنیم. چطور بفهمیم که زمان مناسب برای این کار فرا رسیده؟
15. برای کاهش تکه تکه شدگی ایندکس ( Fragmentation) آیا بهتر است از قسمت Fragmentatin و انتخاب گزینه Reorganiz Index استفاده بشه یا با دستور Drop Existing ، ایندکس رو از نو بسازیم؟. و اینکه چطور بفهمیم که میزان تکه تکه شدگی به حدی رسیده که بر روی کار ایندکس تاثیر منفی گذاشته؟
با توجه به اهمیت مبحث ایندکس گذاری صحیح بر روی جداول چند روزی میشه که دنبال یه منبع خوب میگشتم. متاسفانه جستجوی سایت و وب چیزی نصیب من نکرد. بالاخره از روی کتاب Robin Dewson ترجمه عبدالوهاب فخر یاسری شروع به مطالعه کردم. در کل کتاب مفید بود ولی از ترجمه مطلوب فاصله داره. در حین مطالعه کتاب، سوال ها و ابهامات متعددی واسم پیش اومده که بهترین مکان برای رسیدن به جواب سوال هام رو اینجا دیدم.
جواب تعدادی از این سوالات شاید ساده به نظر بیاد ولی بهرحال واسه من مبهم هستن.
تعداد سوالات 15 تا هست و چون همه سوالات مربوط به مبحث ایندکس هست، بهتر دیدم که همه رو در یک تاپیک (به جای چند تاپیک پراکنده) بیارم. قطعا جواب صحیح به این سوالات در آینده به درد بقیه دوستان هم خواهد خورد. دوستان به هر کدوم از سوالات که اطلاع دارند ممنون میشم توضیح مناسب و کافی رو بدن. پیشاپیش از همه دوستان تشکر میکنم.
اما سوالات :
1. با توجه به اینکه ایندکس بر روی تعداد داده های زیاد مفهوم و کارایی واقعی خودش رو نشون میده، این تعداد رکورد رو چطور باید تشخیص داد؟. یعنی چطور بفهمیم که یک جدول به ایندکس نیاز داره؟.
2. در نرم افزارهایی که بصورت شبکه می سازیم و دیتابیس رو بر روی سیسیتم سرور قرار میدهیم،چون ایندکس ها نیاز به پردازش و جابه جایی رکوردها یا بروزرسانی مداوم آمار خود هستند. مشخصات سخت افزاری سرور باید حداقل به چه صورتی باشه؟ (حدودا برای 10 کلاینت فرض کنید و چند حالت مختلف رو از نظر فشار وارده بر سرور از طرف کلاینت ها در نظر بگیرید).
3. در تعیین نوع ایندکس (دسته ای و غیردسته ای)، آیا اولویتی وجود داره یا طبق شرایط نوع فیلدها نوع ایندکس هم تعیین میشه؟. آیا از لحاظ سرعت، بین این دو نوع ایندکس تفاوتی وجود داره؟
4. جدولی رو با تعداد رکورد بالای 1 میلیون در نظر بگیرید که شامل شماره شناسنامه، نام و نام خانوادگی باشه که داده ها بصورت نامرتب درون جدول ذخیره شدن. اگر در برنامه جستجو براساس هم "شماره شناسنامه" انجام بشه و هم "نام و نام خانوادگی". بهترین نوع ایندکس گذاری برای چنین جدولی چی هست؟ (دسته ای یا غیر دسته ای؟)
5. اگر ایندکسی رو بصورت unique تعریف کنیم، آیا اجازه دریافت مقدار null رو داره یا نه؟. اگر داره امکان دریافت دو یا چند ستون null وجود داره یا نه؟
6. استفاده از covering index در چه مواردی کاربرد داره؟. با توجه به اینکه در این حالت، ایندکس بر روی تمامی ستون ها تعریف میشه و در کتاب تاکید شده که ایندکس بر روی بیشتر از 4 ستون خیلی کار درستی نیست.
با توجه به این موضوع، آیا تضادی بوجود نمیاد؟ (بین covering index که روی همه ستون ها تعریف میشه و قرار نگرفتن ایندکس بر روی بیش از 4 ستون)
7. اگر ایندکس بر روی نام خانوادگی (یا کلا هر فیلد فارسی) قرار داشته باشه، آیا در فامیل هایی که با "ی" و "ک" شروع میشن، امکان اشتباه در مرتب سازی وجود داره؟.(همون مشکل همیشگی بین حروف فارسی و عربی)
8. اگر بر روی یک ستون عددی که مقادیر بصورت نامنظم وارد میشوند یک ایندکس دسته ای (clustered index) قرار بگیره. در هنگام درج داده جدید، واسه اینکه رکورد جدید در جای مناسب خودش قرار بگیره، احتمال زیاد نیاز هست که تعداد رکوردهای زیادی شیفت داده بشن تا رکورد جدید در جای مناسب خودش قرار بگیره که این امر باعث کاهش سرعت اجرای درج داده ها میشه. در کتاب گفته شده که برای کاهش تاثیر این کار از sql 2005 به بعد اجازه تعیین عاملی پر کننده به هنگام ایجاد ایندکس وجود داره. من این موضوع رو اصلا درک نکردم.این حرف یعنی چی و کجای تعریف ایندکس باید چنین موردی رو لحاظ کرد؟.
9. ایندکسی رو در نظر بگیرید که بر روی سه ستون شماره شناسنامه، نام و نام خانوادگی ایجاد شده باشه. اگر جستجوی ما فقط براساس شماره شناسنامه یا فقط براساس نام خانوادگی باشه، در چنین حالتی باز هم sql از ایندکس کمک میگیره؟ یا فقط زمانی از ایندکس استفاده میشه که در شرط جستجو، هر سه فیلد قید شده باشند؟
10. با توجه به اینکه ایندکس همیشه مطلوب نیست و بعضی وقت ها نتیجه عکس میده، آیا راهی (یا ابزاری) وجود داره که بتونیم تست کنیم که آیا وجود ایندکس برای اون جدول بهتره یا نداشتن ایندکس؟
11. در چه حالات و شرایطی ممکنه ایندکس خوب دیروز به ایندکس بد امروز تبدیل بشه؟. لطفا در قالب مثال توضیح بدید.
12. فیلدی که در جدول کلید اصلی هست،اگر بر روی آن ایندکس قرار دهیم آیا الزاما باید آنرا یونیک کنیم؟
13. برای بروزرسانی آمار ایندکس از گزینه Statistics Recompute (یا Statistics NoRecompute ) استفاده میشه. در چه مواردی باید این گزینه رو بر روی on و درچه مواردی بر روی off تنظیم کرد؟
14. برای فشردن ایندکس و از بین بردن فضای ایجاد شده در دیسک، گفته شده با استفاده از دستور Drop Existing ، ایندکس رو مجددا ایجاد کنیم. چطور بفهمیم که زمان مناسب برای این کار فرا رسیده؟
15. برای کاهش تکه تکه شدگی ایندکس ( Fragmentation) آیا بهتر است از قسمت Fragmentatin و انتخاب گزینه Reorganiz Index استفاده بشه یا با دستور Drop Existing ، ایندکس رو از نو بسازیم؟. و اینکه چطور بفهمیم که میزان تکه تکه شدگی به حدی رسیده که بر روی کار ایندکس تاثیر منفی گذاشته؟