PDA

View Full Version : فایده ایجاد index در جداول چیست؟



hadi-z
یک شنبه 13 آذر 1390, 09:44 صبح
سلام
اگه ایندکس تعریف نشه چه اتفاقی می افته؟
حالا اگر تعریف شد چجوری باید ازش استفاده بشه؟
آیا تو کد هم میشه از ایندکس استفاده کرد؟

panahgah
یک شنبه 13 آذر 1390, 22:38 عصر
افزایش سرعت برای دسترسی به داده های جدول هست . وقتی که ما در جدولمون هزاران رکورد داشته باشیم بازیابی اطلاعات ممکنه زمان بر باشه اما با ایجاد ایندکس بر روی ستون ها می تونه این مشکل رو حل کنه . وقتی ایندکس ایجاد می شه ابتدا داده ها رو Sort می کنه .


CREATE INDEX index_name
ON table_name (column_name1,column_name2...);

hadi-z
دوشنبه 14 آذر 1390, 15:23 عصر
افزایش سرعت برای دسترسی به داده های جدول هست . وقتی که ما در جدولمون هزاران رکورد داشته باشیم بازیابی اطلاعات ممکنه زمان بر باشه اما با ایجاد ایندکس بر روی ستون ها می تونه این مشکل رو حل کنه . وقتی ایندکس ایجاد می شه ابتدا داده ها رو Sort می کنه .


CREATE INDEX index_name
ON table_name (column_name1,column_name2...);

ممنون از توجهتون
ولی حالا بعد از تعریف ایندکس چجوری میشه تو کد یه کوئری برای select زدن از این ایندکس استفاده کرد تا سرعت جست و جو بالا بره؟؟

in_chand_nafar
دوشنبه 14 آذر 1390, 17:20 عصر
دوست عزيز معمولا اگر ايندكس شما مناسب و بهينه باشد SQL Server تصميم به استفاده از آن خواهد گرفت
براي اينكه شما دقيق بدانيد كه ايندكس ها چه زماني مفيد و چه زماني بلاي جون Tableهيتان خواهد شد (مثلا بحث مربوط به Fragment و...) بايد در ابتدا با انواع ايندكس هاي موجود در SQL Server‌آشنا شويد

معمولا در حالت خيلي ساده براي آموزش مبحث ايندكس در SQL Server دو نوع ايندكس معرفي مي شود
1- Clustered Index : اين نوع ايندكس ها مانند ديكشنري هستند يعني اينكه داده ها مورد نظر شما را مانند يك ديكشنري مرتب مي كنند. يك جدول هم مي تواند فقط يك نوع از اين ايندكس ها داشته باشد كه به طور معمولا خيلي ها از آن در هنگام ايجاد PK‌ استفاده مي كنند كه ممكن در بعضي مواقع بهنيه نباشد
2- Non Clustered Index : اين نوع ايندكس ها مانند ايندكس انتهاي كتاب هستند اگ به انتهاي كتاب مراجعه كنيد مشاهده مي كنيد كه برخي از كلمات در انتهاي كتاب نوشته شده و جلوي آنها رجوع به يك شماره صفحه خاص ذكر شده است.
تمامي اين حالاتي كه بالا اشاره شد در SQL Server وجود دارد اين چند لغت را به ذهنتون بسپاريد تا در آموزش هاي بعدي اونها را كامل بشكافم

در ضمن بايد به دو سه تا نكته اشاره كنم
1- اكر جدول شما PK‌داشته باشه به طور خودكار يك Clustered Index‌براي كنترل PK‌ايجاد ميشه (مگر اينكه شما نخواهيد)
2- اگر جدول تون ايندكس نداشته باشه بدترين چيز ممكن اتفاق مي افتاد SQL براي پيدا كردن داده هاي / ركوردهاي مورد نظر شما مجبور كل جدول را Scan (پويش كردن /گشتن براي پيدا كردن داده) كنه كه زمان و IO و... زيادي با توجه حجم داده شما خواهد برد

نحوه ايجاد Clustered Index
نحوه ايجاد NonClustered Index
Fragmentation
Fill Factor
Filtered Index
Missing Index
Rebuild كردن ايندكس ها
Reorganizeكردن ايندكس ها
مفهوم Table Scan
خوب اگر حصوله نداري بزار بمونه براي روزهاي بعد

یوسف زالی
دوشنبه 14 آذر 1390, 18:46 عصر
سلام دوست من.
نیکی و پرسش؟
منتظر آموزشهاتون هستیم.

hadi-z
دوشنبه 14 آذر 1390, 22:43 عصر
خیلی خیلی ممنونم از توضیحاتت

پس با توجه به مطالبی که گفتی بود یا نبود ایندکس در کدی که ما برای کوئری میزنیم تاثیری نداره.
و استفاده از اون به عهده خود سرویس sql هست. درسته؟

in_chand_nafar
دوشنبه 14 آذر 1390, 23:31 عصر
نه عزيز اگر ايندكس نداشته باشي و حجم اطلاعات شما بالا باشه فاتحه Select شما خونده است معمولاً ايندكس رو براي دسترسي به داده ها با سرعت بالا طراحي مي كنند
بحث Query Optimization توي SQL يه مبحث كاملا حرفه اي و تخصصي است در پروژه هاي دانشجويي جمع دو عدد (تركيب سه تا جدول و...) با هم شايد زياد به چشم نياد اما در پروژه هاي بزرگ با تعداد كاربر بالا و حجم اطلاعات بالا اگر شما ايندكس مناسبي نداشته باشي معمولا سرعت اجراي كوئري هايت خيلي پايين ميشه كه اين براي نرم افزار شما و... خيلي خطرناك ميشه
به ياد دارم كه سال 88 به خاطر عدم وجود يك ايندكس نامناسب در يكي از جداولمان كه نزديك به 50 ميليون ركورد داشت (تازه SQL 2000 هم بود) نزديك بود فاتحه سيستم مون خونده بشه كه با يك Trace ساده و بررسي تا ساعت 3 صبح توي محل مشتري مشكل رو حل كرديم (حذف ايندكس نامناسب)
شما يادتون باشه جداولتون حداقل كم كم بايد داراي كلاستر ايندكس باشند كه 99 درصد ملت معمولا زمانيكه PK يا كليد اصلي ايجاد مي كنند خود به خود از SQL مي خواهند كه كلاستر ايندكس رو براشون ايجاد كنه چون قانون SQL اين است كه PK‌را با كلاستر ايندكس كنترل كنه مگر اينكه خلافش (در صورتيكه شما بخواهين) ثابت بشه
نبود ايندكس = اسكن كردن كل يك جدول
اين بدترين چيز ممكن است زمانيكه نتيجه برگشتي كوئري شما تعداد كمي از ركوردهاي يك جدول باشد (كه معمولا هدف يه دستور Select‌هم همين از بين 10 هزار ركورد 50 و يا هر چند تايي تاي كه در شرط شما صدق مي كنه نمايش داده بشه)
منتظر آموزش ها باشيد

hadi-z
سه شنبه 15 آذر 1390, 00:05 صبح
بازم ممنون

ولی من منظورم این نبود که ایندکس نباشه

من میگم بود و نبود اون تو نحوه کد نویسی ما برای دیتابیس تاثیری نداره. درسته؟

in_chand_nafar
سه شنبه 15 آذر 1390, 01:25 صبح
ميشه گفت آره معمولا كوئري را به بهترين شكل ممكن مي نويسند از لحاظ Join و اشاره صريح به ليست فيلدهايي كه نياز داريد (نه در همه Selectها) و... بعد در SQL اين كوئري را آنالايز و اگر سرعتش پايين بود ايندكس مناسب رو ايجاد مي كنند

baktash.n81@gmail.com
شنبه 19 آذر 1390, 11:01 صبح
سلام

در واقع بهتره که Index ها از روی Query ها و نحوه استفاده از جداول ایجاد بشه البته مباحث دیگه ای هم مطرح هست ... مثلا اگر تعداد Index ها روی یک جدول زیاد بشه عملیات insert و update رو کند می کنه ...

nilo_nazanin
جمعه 25 آذر 1390, 21:45 عصر
میشه این مبحـــثو برای جدامل خیلی کوچیک مثل جداول تمیرینات کلاسی نوضیح دهید ؟