PDA

View Full Version : سوال: تعریف ایندکس و کار برد آن



khadem1386
چهارشنبه 15 آبان 1387, 00:50 صبح
با سلام به تمامی دوستان گرامی:

چه مواقعی باید یکی از ستونهایمان را بصورت ایندکس در بیاوریم.

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

یا شایدم روشی باشه برای join کردن چند تا جدول با همدیگه

اصلا اگر ایندکس نکنیم چه ضرری داره؟


اگر کسی بتونه با مثال برام توضیح بده ممنون می شم از وقت ایشان

khadem1386
چهارشنبه 15 آبان 1387, 12:18 عصر
شاید ایندکس کمک می کند تا دیتا بیس بر اساس یک ستون بصورت فیزیکی مرتب شود.

ایندکس بیشتر به درد سرعت مرتب کردن یک جدول می خوره order by

یا سرعت در سرچ کردن یک ستون (where)

ALI MIRNIA
دوشنبه 11 آذر 1387, 00:15 صبح
با سلام به تمامی دوستان گرامی:

چه مواقعی باید یکی از ستونهایمان را بصورت ایندکس در بیاوریم.

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

یا شایدم روشی باشه برای join کردن چند تا جدول با همدیگه

اصلا اگر ایندکس نکنیم چه ضرری داره؟


اگر کسی بتونه با مثال برام توضیح بده ممنون می شم از وقت ایشان
با سلام خدمت دوستان اگر متن زیر را بخوانید در انتها خودتان پاسخ را متوجه می شوید.
ولی پاسخ سریع اینکه اگر حجم داده ها بالا باشه ایندکس خیلی سرعت کار رو افزایش میده ولی اگر ایندکس نزده باشی سیستمی که فروختی یک هفته ای (اگر حجم اطلاعاتش بالا باشه) بر می گردونن یا چیزای دیگه خدمتتون میگن:عصبانی: به همین راحتی در مورد مثال هم اول متن رو بخونید بعدا بهش با مثال می پردازیم.
در این پاسخ می خواهم کمی به دورن ایندکس سری بزنیم تا بتوانم موضوع ایندکس این مسئله خیلی مهم که برخی به آن کمتر اهمیت می دهند بپردازیم.
مقدمه :
ایندکس های همانند فهرست یک کتاب عمل میکنند اگر به دنبال مطلب خاصی از یک کتاب باشید به فهرست راهنما ( که معمولا در آخر کتب وجود دارند ) مراجعه نموده و به کمک آن می توانید به سرعت صفحه یا صفحاتی که حاوی موضوع مورد نظر شما است راپیدا کنید و به آن مطلب مراجعه نمائید
در MS-SQL Server نیز وقتی به دنبال یک سطر خاص جستجو میباشید ، سرور با استفاده از ایندکس محل فیزیکی سطر مورد نظر را با سرعت بیشتری پیدا می کند .
راه دیگری برای دسترسی به داده ها موجود در یک ( یا چند) جدول روش table scan یا Sequential ( جستجوی پیاپی) است در این روش سرور سطرهای جدول را از ابتدا ی جدول ، یک به یک بررسی می کند تا سطر ( یا سطرهای ) مورد نظر خود را پیدا کند . اگر جدول بسیار بزرگ باشد و سطر ( یا سطرها ) در اواسط یا انتهای جدول بلشد این جسجو مستلزم صرف زمان و منابع قابل توجهی خواهد بود با استفاده از ایندکس دیگر نیاز یبه استفاده از جستجوی پیاپی نخواهیم بود .
دلایل استفاده از ایندکس:
1- سازمان دهی داده ها
2- افزایش سرعت عملیات بازیابی یا تغییر داده ها ( این موضوع قابل بحث است)
3- اعمال یکتایی

{
کالبد شکافی اجرای یک درخواست
قبل ازاینکه وارد بحث اصلی بشویم خوب است ابتدا مراحلی که سرور برای اجرای یک درخواست انجام می دهد را کالبد شکافی کنیم ( برای همه از جمله خودم نیز خوب است )

1- تفکیک (parse) :درستی املائی درخواست و همه اشیاء مورد استفاده آن را بررسی می کند
2- بهینه سازی : سرور بهترین روش اجرای درخواست را تعیین میکند
3- ترجمه : سرور طرح اجرایی پرسش را می سازد
4- اجرا: طرح اجرای تولیدی مرحله 3 اجرا میگردد.

در مرحله 2 سرور باید تصمیمات متعددی را درباره نجوه پردازش پرسش و نیز درباره ایندکسهایی که باید مورد استفاده قرار گیرند ، اخذ نماید.:تشویق:

SQL Server برای بهینه سازی در خواست از روشی موسوم به بهینه سازی مبتی بر هزینه (Cost based) استفاده میکند یعنی سرور سعی میکند میزان حافظه در مراجعه به دیسک را به عنوان هزینه در نظز بگیرد و به دنبال کمترین هزینه می باشد فرآیند بهینه سازی در چهار مرحله انجام می شود
1- پیدا کردن آرگومان جستجو (Serach Argument)
2- تطبیق دادنSerach Argument با ایندکس های موجود ( که اینجا ایندکس خوب و مناسب سرعت کار را افزایش می دهد )
3- برآورد هزینه به ازاری هر ایندکس
4-انتخاب بهترین مسیر
در این قسمت با نحوه اجرای درخواست به طور کلی آشنا شدید البته ممکن است برخی کمی در این مورد بحث داشته باشند که خوشحال می شوم اشاره نمایند و در صورت وجود اطلاعات پاسخ آنها را بدهم.:شیطان:
خوب می رویم سر اصل مطلب :
ایندکس ها :


بطور کلی دو نوع ایندکس در MS SQL Server وجود دارد
Clustered Index ایندکس خوشه ای
Non Clustered Index ایندکس غیرخوشه ای که خود نیز به دو دسته تقسیم میشودند

ایندکسهای عیر خوشه ای روی یک پشته heap
ایندکسهای عیر خوشه ای روی ایندکس خوشه ای :متفکر::عصبانی++:

ایندکس خو شه ای :
ایندکس خوشه ای سطر های داده ها را بر مبنای کلید ایندکس ، واقعا مرتب می کندیعنی جدول به صورت فیزیکی بر مبنای کلید ایندکس مرتب می شود.
نکته :در SQL Server هر جدول تنها می تواند حاوی یک ایدکس خوشه ای باشدچرا؟ چون هر جدول را نمی توان بیش از یک ترتیب فیزیکی ، مرتب نمود.
اگر در جدول برای آن کلید اصلی تعریف کنید به صورت خودکار یک ایدکس خوشه ای برای آن ساخته می شود ( سئوال در جدوال واسط که چند کلید اصلی داریم چند ایندکس داریم ؟اگر کسی پاسخ صحیح بده 5جلد ebook مربوط به SQL Server 2008 جایزه می گیره :شیطان:( روح شیطانی من )
بچه ها من B*Tree را این بخش نیاورم ولی اگر کسی خواست در مراجعه بعدی اون مطرح می کنم و اون :کف:موقع هستش که ایندکس را بیشتر کالبد شکافی کرد.

ایندکس غیر خوشه ای :
ایندکس های غیر خو شه ای تفاوتی جزیی با ایندکس خو شه ای دارند . ایندکس غیر خوشه ای به جایی اینکه خود جدول را مرتب بکند جدول مجزایی را می سازد که حاوی مقادیر کلید مرتب شده است به این ترتیب هر جدول می تواند چندین ایندکس خوشه ای باشد

*****
خوب من که از تایپ کردن خسته شدم بریم ببینم چه نوع ایندکسی انتخاب کنیم در پاسخ های بعدی B*Tree و کالبد شکافی ایندکس و همچنین الزام برای استفاده از ایندکس خاص و سایر مسائل ایندکس رو می گویم ان شاء الله

****
توجه: ایندکس خوشه ای سریع تر از غیر خوشه ای است.
مهم
در اتنخاب ایندکس باید به مسائل زیر توجه کنید :


اگر به دنبال محدوده ای از مقادی در جداول بزرگ هستید از ایندکس خوشه ای استفاده کنید .
اگر خروجی ایندکس باید مرتب باشد از ایندکس خوشه ای استفاده کنید
اگر در ستونهایی پراکندگی داده ها زیاد است از ایندکس غیر خوشه ای استفاده کنید.
در نهایت وقتی به ایندکس فکر می کنید چند سئوال زیر را از خود بپرسید.


در جدوال
اگر در این جدول درج و تغییر رکورد زیاد صورت می گیرد ؟ اگر بله است از حداقل ایندکس استفاده کنید به نظر بنده همان خوشه ای کافیست زیرا ایندکس زیاد باعث کاهش سرعت درج و تغییر میشه
آیا این جدول بیشتر در گزارش گیری استفاده میشه ؟ تعداد درج و تغییر زیاد است ولی تعداد در خواست گزارش نیز خیلی خیلی زیاد ؟ تعداد ایندکس زیادی خوبه ولی بررسی کنید خودم از این مورد حسابی خوردم:گریه:
ایا حجم رکوردها بالا ست ولی هر درخواست کمتر از 4 درصداز رکوردهای جدول را جستجو میکنه ؟اگر بله است ایندکس گذاری منطقی کنید
در فیلد ها : یعنی کدوم فیلد رو ایندکس بزاریم
آیا این فیلد بیشتر در قسنت شرط می آید ؟ اگر بله است ایندکس گذاری کنید
آیا این فیلد در Join استفاده میشه؟ اگر بله است پس ایندکس بذار
دوستان خیلی مطلب را اشاره نکردم ولی اگر بخواهید بهش خواهیم پرداخت
به امید ایرانی آباد

khadem1386
چهارشنبه 13 آذر 1387, 09:31 صبح
یک-- فرق کلید اصلی با اندکس در چی هست؟ آیا کلید اصلی هم باعث مرتب شدن فیزیکی جدول می شه؟
چه لوزومی داره که کلید اصلی را تعریف کنید اگر ایندکس خوشه ای است ؟
یا برعکس چه لزومی داره که اندکس خوشه ای تعریف کنیم اگر کلید اصلی است؟
کلید اصلی به تنهایی چه نقشی را بازی می کند اگر ایندکسش نکیم؟

دو --ایندکس غیر خوشه ای به چه میزان حجم فایل را افزایش می دهد.؟
یعنی این جداول کمکی که ساخته می شود هجمشان چه نسبتی با جدول اصلی دارد.؟
برای هر فیلد اندکس شده ی غیره خوشه ای چند جدول فرعی درست می شود؟

سه -- چرا اسم خوشه ای برای این نوع در نظر گرفته اند؟ مثلا شاید اسامی مثل داینامیک یا فیزیکال یا ترتیبی برای این حالت بهتر نبود؟

چهار -- در جایی خواندم که دیگر ترتیب فیزیکی در جداول معنای خاصی ندارد. (که به نظر من درست نیست و ترتیب فیزیکی به هر حال ارزش دارد)

در مورد ترتیب فیزکی یک مشکل وجود دارد.
اگر یک رکورد بخواهد به وسط رکورد ها اضافه شود باید همه رکوردها بعد از آن، اول دونه دونه جابه جا شوند آن هم به صورت فیزیکی بعد که یک جای خالی بوجود آمد آن رکورد را داخلش قرار بدهد. این به نظر خیلی وقت گیر هست و از طرف دیگه هاردها اصولا چیزی به نام ترتیب حقیقی فیزیکی ندارند. جز در پارتیشن بندی.
مثلا اگر کسی خیلی خیلی از درایو f: خودش استفاده کنه تنها یک بخش فیزیکی مشخص از هاردش نخ نما می شه. ولی در مورد یک فایل این گونه نیست یک فایل واقعا در کل هارد پخش می شه. (هزار تیکه مثل جیگر زلیخا) .
آیا این حرف ها درست است؟

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

در ضمن از پاسخ شما و پیگیری این مطلب بسیار تشکر می کنم:تشویق:

khadem1386
چهارشنبه 13 آذر 1387, 09:37 صبح
دوست عزیز، آقای MIRNIA چرا در جاهایی که می خواهی کمک کنی بجای آیکون فرشته آیکون شیطان گذاشته ای؟

گر در جدول برای آن کلید اصلی تعریف کنید به صورت خودکار یک ایدکس خوشه ای برای آن ساخته می شود ( سئوال در جدوال واسط که چند کلید اصلی داریم چند ایندکس داریم ؟اگر کسی پاسخ صحیح بده 5جلد ebook مربوط به SQL Server 2008 جایزه می گیره :شیطان:( روح شیطانی من )
در این قسمت با نحوه اجرای درخواست به طور کلی آشنا شدید البته ممکن است برخی کمی در این مورد بحث داشته باشند که خوشحال می شوم اشاره نمایند و در صورت وجود اطلاعات پاسخ آنها را بدهم.:شیطان:

ALI MIRNIA
چهارشنبه 13 آذر 1387, 11:07 صبح
یک--
1-1 فرق کلید اصلی با اندیکس در چی هست؟
1-2آیا کلید اصلی هم باعث مرتب شدن فیزیکی جدول می شه؟
1-3چه لوزومی داره که کلید اصلی را تعریف کنید اگر ایندکس خوشه ای است ؟
1-4یا برعکس چه لزومی داره که اندکس خوشه ای تعریف کنیم اگر کلید اصلی است؟
1-5کلید اصلی به تنهایی چه نقشی را بازی می کند اگر ایندکسش نکیم؟
با سلام خدمت شما ( پاسخ به سوالات را چون شامل چند بخش است با *-1 جدا نمودم )

دراین بخش به سوالات ازیستنسیالیسم شما (یعنی چالش بر انگیز (یکی از دوستانم می گفت )) پاسخ می دهم امید وارم که بتونم جواب قانع کننده ای بدهم .
1-1اولین تفاوتی اساسی که بین کلید اصلی و ایندکس اگر Unique نباشد در این است که در کلید اصلی باید داده ها یکتا باشند ولی در ایندکس اشاره شده می توانند داده ها یکسان باشند .
1-2 بله به علت اینکه شما وقتی کلید اصلی در جدول ایجاد می کنید باعث به وجود آمدن یک ایندکس خوشه ای به صورت اتوماتیک می شه.
1-3 اولا بسیاری از قوانین پایگاه داده ای نقض مشه:متعجب:ثانیا چون ممکن ایندکس unique نباشه
1-4 عزیرم ایندکس خوشه ای وقتی کلید اصلی تعریف میشه به وجود می آید مگر اینکه خودت دستکاری کنی که یکی از موارد اینکه سرعت کاهش پیدا میکنه ما ایندکس گذاری می کنیم که سرعت افزایش پیدا کنه:گریه:
1-5 نقش کلید اصلی را پیدا میکنه:عصبانی:و هم اینکه سرعتت کم میشه :گریه::گریه::گریه:



دو --ایندکس غیر خوشه ای به چه میزان حجم فایل را افزایش می دهد.؟
یعنی این جداول کمکی که ساخته می شود هجمشان چه نسبتی با جدول اصلی دارد.؟
برای هر فیلد اندکس شده ی غیره خوشه ای چند جدول فرعی درست می شود؟
در کلیه موارد بالا بستگی به حجمش داره


سه -- چرا اسم خوشه ای برای این نوع در نظر گرفته اند؟ مثلا شاید اسامی مثل داینامیک یا فیزیکال یا ترتیبی برای این حالت بهتر نبود؟
نه اگر مفهوم B*tree را کاملا بدونی این نام بهترین اسم هستش.


چهار -- در جایی خواندم که دیگر ترتیب فیزیکی در جداول معنای خاصی ندارد. (که به نظر من درست نیست و ترتیب فیزیکی به هر حال ارزش دارد)
در مورد ترتیب فیزکی یک مشکل وجود دارد.
اگر یک رکورد بخواهد به وسط رکورد ها اضافه شود باید همه رکوردها بعد از آن، اول دونه دونه جابه جا شوند آن هم به صورت فیزیکی بعد که یک جای خالی بوجود آمد آن رکورد را داخلش قرار بدهد. این به نظر خیلی وقت گیر هست و از طرف دیگه هاردها اصولا چیزی به نام ترتیب حقیقی فیزیکی ندارند. جز در پارتیشن بندی.
مثلا اگر کسی خیلی خیلی از درایو f: خودش استفاده کنه تنها یک بخش فیزیکی مشخص از هاردش نخ نما می شه. ولی در مورد یک فایل این گونه نیست یک فایل واقعا در کل هارد پخش می شه. (هزار تیکه مثل جیگر زلیخا) .
آیا این حرف ها درست است؟
در این زمینه لطفا منبع را نام ببرید ولی الان نمی تونم به این سئوال پاسخ بدم باید بیشتر بررسی کنم .

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