تور لحظه آخری
امروز : دوشنبه ، 11 تیر 1403    احادیث و روایات:  پیامبر اکرم (ص):سه چيز است كه اگر مردم آثار آن را مى‏دانستند، به جهت حريص بودن به خير و بركتى ...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها

تبلیغات

تبلیغات متنی

اتاق فرار

خرید ووچر پرفکت مانی

تریدینگ ویو

کاشت ابرو

لمینت دندان

ونداد کولر

صرافی ارکی چنج

صرافی rkchange

دانلود سریال سووشون

دانلود فیلم

ناب مووی

رسانه حرف تو - مقایسه و اشتراک تجربه خرید

سرور اختصاصی ایران

تور دبی

دزدگیر منزل

تشریفات روناک

اجاره سند در شیراز

قیمت فنس

armanekasbokar

armanetejarat

پیچ و مهره

طراحی کاتالوگ فوری

دانلود کتاب صوتی

تعمیرات مک بوک

Future Innovate Tech

آموزشگاه آرایشگری مردانه شفیع رسالت

پی جو مشاغل برتر شیراز

قیمت فرش

آموزش کیک پزی در تهران

لوله بازکنی تهران

کاشت پای مصنوعی

میز جلو مبلی

پراپ رابین سود

هتل 5 ستاره شیراز

آراد برندینگ

رنگ استخری

سایبان ماشین

قالیشویی در تهران

مبل استیل

بهترین وکیل تهران

شرکت حسابداری

نظرسنجی انتخابات 1403

استعداد تحلیلی

کی شاپ

خرید دانه قهوه

دانلود رمان

وکیل کرج

آمپول بیوتین بپانتین

پرس برک

بهترین پکیج کنکور

خرید تیشرت مردانه

خرید نشادر

خرید یخچال خارجی

وکیل تبریز

اجاره سند

وام لوازم خانگی

نتایج انتخابات ریاست جمهوری

خرید سی پی ارزان

خرید ابزار دقیق

 






آمار وبسایت

 تعداد کل بازدیدها : 1803335014




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

بازسازي ايندکس ها به صورت Online


واضح آرشیو وب فارسی:راسخون:
بازسازي ايندکس ها به صورت Online
بازسازي ايندکس ها به صورت Online     کار ايندکس Online را براي محيط SQL Server خود اختصاصي کنيد: اخيراً کار نگهداري ايندکس ها را به عهده گرفته ام. به رئيسم گفتم که بلوکه کردن که به وسيله سازمان دهي مجدد ايندکس ها انجام مي شود و قفل کردن جدول که به وسيله بازسازي هاي ايندکس Offline انجام ميشود، غير قابل قبول هستند، زيرا محيط SQL Server ما از تمام سيستم هاي Enterprise Edition از SQL Server 2008 و2005 تشکيل شده است و من تصميم دارم از مشکلات اين چنيني جلوگيري کنم. من يک راه حل مناسب با قابليت اختصاصي شدن را جستجو کردم. در نهايت، راه حل خاص خودم را ايجاد کردم، يک کار ايندکس Online که در اين مقاله آن را با شما به اشتراک گذاشته اميدوارم براي شما نيز مفيد واقع شود. نحوه ايجاد اين کار، نحوه پياده سازي اين کار و پرامترهاي مختلف کار را به شما نشان خواهم داد. ايجاد کار ايندکس Online: نيازمندي هاي اوليه من براي اين کار ساده بود. ابتدا بايد مشخص مي کردم کدام ايندکس ها مي توانند به صورت online بازسازي شوند. با نگاه سريعي به MSDN، دستور العمل هاي خاصي مشخص مي شود. انواع داده شي بزرگ (LOB) مثل ، varchar(max ، nvarchar(max ، text ntex ، image varbinary (max و (XML) بايد ايجاد و بازسازي شوند يا به صورت offline حذف شوند. ايندکس هاي خوشه بندي نشده منحصر به فرد مي توانند به صورت online ايجاد شوند، هنگامي که اين جدول حاوي انواع داده LOB است، ولي هيچ يک از اين ستون ها در تعريف ايندکس به عنوان ستون کليد يا غير کليد استفاده نمي شوند. ايندکس هاي خوشه بندي نشده که با ستون هاي نوع داده LOB تعريف مي شوند، بايد به صورت Offline ايجاد يا بازسازي شوند. مشخص کنيد که کدام ايندکس ها مي توانند به صورت online بازسازي شوند، زيرا بازسازي با گزينه ايندکس online در ايندکسي صادر مي شود که با معيار offline بايد متناسب باشد که اين امر منجر به يک خطا و رها شدن ايندکس بدون پردازش مي شود. بعد از تعيين اين که کدام ايندکس ها مي توانند به درستي به صورت online بازسازي شوند، پارامترهاي مختلفي را به مراحل مختلف کار ايندکس اضافه کردم. براي ايندکس هايي که نمي توانند به صورت online بازسازي شوند، مي توانيد آن ها را سازمان دهي مجدد کنيد، از آن ها صرف نظر نماييد يا آن ها را به صورت offline بازسازي کنيد (اگر مدل کسب و کار شما اجازه مي دهد). هم چنين پرامترهايي را اضافه کردم که به شما اجازه مي دهند ايندکس ها را سازمان دهد مجدد کنيد، البته اگر آن ها تحت درصد قطعه بندي خاصي باشند و در صورتي آن ها را بازسازي کنيد که روي درصد خاصي از قطعه بندي باشند. سپس ويژگي هايي را براي رديابي مدت زمان هر ايندکس، زمان شروع و زمان پايان، پيشرفت، قطعه بندي قبل و بعد از اجراي کار و هر بلوکه کردن نتيجه اي را تعبيه کردم. در نهايت، گزينه اي را براي کنار گذاشتن پايگاه داده ها و جداول از عمليات ايندکس اضافه کرده ام. ولي به رئيسم نگفتم که بلوکه کردن در نتيجه سازمان دهي مجدد قابل قبول نبود؟ براي رفع اين مشکل، SPID عمليات ايندکس را رديابي کرده ام و يک کار فرعي را براي پايش هر بلوکه کردن ايجاد کردم که اين عمليات ممکن است به وجود آيند. اگر بلوکه کردن براي بيش از X دقيقه در يک رديف و بلوک هاي بيشتر از X فرآيند وجود داشته باشد، SPID کشته مي شود، دوره زماني طي مي گردد و عمليات ايندکس بر مي گردد. بر طبق گفته مايکروسافت، سازمان دهي مجدد، قفل هاي بلوکه کردن را در دراز مدت نگه نمي دارد؛ بنابراين، SQL Server به هنگام رساني ها يا پرس و جوهاي در حال اجرا را بلوکه نمي کند. هر چند، در محيط هاي شديداً تبادلي نمي توانند از 1800 تراکنش در هر دقيقه فراتر روند، هنگامي که در محيط خودم هستم، بايد مراقب سازمان دهي هاي مجدد باشم، بنابراين تشخيص دهنده بلوکه کردن خودم را دارم. اگر تشخيص دهنده بلوکه کردن، يک SPID را بکشد که در فرآيند انجام يک بازسازي است، چه اتفاقي مي افتد؟ به دليل اين که عمليات بازسازي به عنوان تراکنش هاي مستقل روي مي دهند، rollback تحميل شده از کشتن يک بازسازي offline روي يک ايندکس بزرگ که در حال تکميل شدن بوده است، خيلي بدتر از اين است که به عمليات اجازه ادامه داده بدهيم. به اين دليل، آن ها را با تشخيص دهنده بلوکه مدنظرقرار ندادم. همچنين با بازسازي Online به دلايل مختلفي را مد نظر نداشتم ، از قبيل پيچيدگي هاي کارآيي احتمال مربوط به برگشت به نگاشت ايندکس ها. بر طبق Microsoft SQL Server "2005 Index Operations" (technet.microsoft.com/en-us/library/cc966402.aspx "فقط دوره هاي زماني خيلي کوتاهي وجود دارد که در آن ها، از عمليات Select و DML هم زمان جلوگيري مي شود". هر بلوکه کردني بايد قابل تحمل باشد و جايگزين هايي داشته باشد. يک سازمان دهي مجدد، داستان متفاوتي است. به دليل اين که يک سازمان دهي مجدد فقط روي يک جفت صفحه در يک زمان عمل مي کند، اگر کشته شود، فقط عمليات جايگزيني فعلي تحت تأثير قرار مي گيرد. مرتبه بعدي که يک سازمان دهي مجدد صادر مي شود، اين کار هنگامي بهبود مي يابد که از آ ن دست بکشيم .
بازسازي ايندکس ها به صورت Online
پياده سازي کار ايندکس: براي ايجاد کار ايندکس، اين کد را اجرا کنيد که مي توانيد آن را از www.sqlmag.com با InstantDOC ID 101777 به اين ترتيب دان لود کنيد: 1-Usp_update_schedule_enabler.sql 2-Index_BuildlndexKey.sql 3-Index_Processlndexes.sql 4-Index_PostCleanup_sql 5-Index_PostFragCale.sql 6-Index_HandleBlocking/sql 7-jod_Blocking_Killer.sql 8-job_Indexing_Master.sql توجه داشته باشيد که از پايگاه داده اي به نام "Common" براي ميزباني عملکرد مشترک بين چندين سرور استفاده کردم. قبل از اجراي اين فايل هاي اجرايي، بايدCommon را در هر اسکريپت با مراجعي جايگزين کنيد تا مناسب محيط شما باشد. هم چنين، در رويه Index_BuildIndexKey، جداولي را در يک گروه فايل "Tables" ايجاد کردم. بايد Tables را به نام گروه فايل تغيير دهيد، وگرنه کار ناموفق خواهد بود. هنگام اجراي job_Indexing_Master.sql، چهار هشدار مرحله ناموجود را دريافت خواهيد کرد. صرف نظر کردن از آن ها ايمن است. هر مرحله در يک کار بايد به صورت ترتيبي ايجاد شود و برخي مراحل، براي صرف نظر کردن از مراحل بعدي در رويداد عدم موفقيت مرحله اي تنظيم مي شوند. مثلاً، اگر مرحله 2 نا موفق باشد، کار به مرحله8 مي رود. هنگامي که مرحله 2 ايجاد مي شود، قطعاً مرحله8 هنوز وجود ندارد و هشداري صادر مي شود. بعد از اجراي اسکريپت هاي فراهم شده، دو کار SQL Server Agent غير فعال جديد را خواهيد ديد: DB Maint-Blocking Killer و DB-Maint IndexMaint . مراحل کار DB-Maint IndexMaint را طوري نام گذاري کرده ام که خود توضيح باشند. در ادامه سريعي بر اين مراحل داريم: *مرحله1 يک جدول رديابي را مي سازد که به وسيله تمام مراحل بعد براي انجام عمليات آن ها مصرف مي شود. اين مرحله حاوي بررسي ويرايش و بررسي نگارش است. اگر از ويرايش و نگارش مناسب براي بازسازي online استفاده مي کنيد، تمام ايندکس هاي مدنظر براي بازسازي به صورت offline انجام خواهند شد. *مرحله2 و مرحله8 براي تنظيم مدت پشتيبان گيري در صورت لزوم هستند. اين عملکرد به رشد و پر شدن logهاي تراکنش شما بسته به پيکربندي هاي درايو و رشد خودکار کمک مي کند. بخاطر داشته باشيد که logهاي تراکنش شما در طي يک عمل بازسازي شفاف نيستند، زيرا همان گونه که بيان کردم، يک عمل بازسازي به عنوان يک تراکنش منفرد روي مي دهد. *مرحله 3 و مرحله7 کار DB Maint-Blocking Killer ايجاد شده قبل را براي پايش مقدار بلوکه کردن توسط يک عمل ايندکس خاص به وجود آمده است، فعال و غير فعال مي کنند. اگر بخواهيد اين ويژگي را اجرا کنيد، اين مراحل را حذف کنيد. *مرحله4 و مرحله9 در صورتي انجام مي شوند که بتوانيد از مدل بازيافت در محيط سوييچ کنيد. من روش بهترين شيوه مايکروسافت را در هر مرحله کار گنجانده ام تا به مدل هاي بازيافت مختلف توجه داشته باشيم. اين ويژگي را به خاطر دارم که بازسازي يک عمل باlog حجيم است، بدين معني که هنگامي که پايگاه داده شما در مدل بازيافت logged حجيم است، در حداقل log بماند. بر طبق "SQL Server2005 Online Index Operations" هنگام بازسازي يک ايندکس در يک پايگاه داده با logged حجيم، نسبت log به داده، 10درصد نسبت log به داده بازيافت کامل است. logging حداقل هنگامي مفيد است که بخواهيد اندازه log تراکنش را قابل مديريت نگه داريد، مخصوصاً در محيط هاي کپي برداري. *مرحله5 تمام ايندکس ها را در جدول ايجاد شده در مرحله 1 پردازش مي کند. مي توانيد retry interval و retry attempts را در اين مرحله با زمان مناسب براي انتظار در رويدادي که در آن blocking killer اين مرحله را خاتمه مي دهد، تغيير دهيد. *مرحله 6 هر يک از عمليات ناقص يا نا موفق را در log خطاي SQL Server ثبت مي کند. *مرحله 10 برگشته و قطعه بندي را دوباره محاسبه مي کند، بنابراين مي توانيد تصوير قبل و بعد را ببينيد. *مرحله 10 و مرحله1 از ديدگاه مديريت پويا (DMV) sys.dm_db_index_physical_stats براي جمع آوري اطلاعاتي درباره ايندکس ها استفاده مي کنند که فقط نياز به يک قفل جدول IS دارد، بدون توجه به حالتي که در آن اجرا مي شود. شکل 1 تمام مراحل فهرست شده بالا را در SQL Server Management Studio SSMS)) نشان مي دهد. پرامترهاي کار: بايد نحوه استفاده از تمام پرامترهاي ورودي را براي اختصاص کردن طراحي کار ايندکس براي محيط خود بدانيد. رويه ذخيره شده در اولين مرحله کار DB-Maint Index Maint (Build Indexing Key تعداد پارامتر را مي پذيرد. @minFragPercent حداقل درصد قطعه بندي يک ايندکس است که بايد قبل از در نظر گرفتن يک عمليات ايندکس لحاظ شود. مي توانيد حداقل درصد قطعه بندي را بر طبق نيازهاي خاص خود تنظيم کنيد. هر چيزي در زير اين آستانه، صرف نظر خواهد شد.@maxAttempts تعداد دفعاتي است که يک عمليات ايندکس که قبلاً توسط کار DB Maint-Blocking Killer به خاطر بلوکه کردن مازاد کشته شده است، برگردانده خواهد شد. اگر بخواهيد فقط يک يا دو پايگاه داده را مد نظر قرار دهيد، از @databaselncludelist استفاده کنيد که يک varchar با حائل کاما است. اگر بخواهيد فقط تعدادي پايگاه داده را کنار بگذاريد، از @databaseExcludelist استفاده کنيد که آن هم يک varchar با حائل کامل است. سرانجام، اگر بخواهيد فقط يک جدول خاص را کنار بگذاريد، مي توانيد اين کار را با استفاده از @table Excludelist انجام دهيد. رويه ذخيره شده در مرحله 5 کار ايندکس نيز تعدادي پارامتر را مي گيرد که شکل 2 نشان مي دهد @reorgMinFragPercent حداقل مقدار قطعه بندي است که بايد براي سازمان دهي مجدد وجود داشته باشد. اين مقدار نبايد زير مقدار @minFragPercent در مرحله Build Index Key باشد. @rebuildMinFragPercent حداقل قطعه بندي است که بايد براي بازسازي وجود داشته باشد. مثلاً، اگر اين مقادير را با 20 درصد و 30 درصد تنظيم کنيد، هر چيزي زير 20 درصد قطعه بندي صرف نظر خواهد شد، هر چيزي بين 20 و 30 درصد قطعه بندي سازمان دهي مجدد مي شود و هر چيزي بزرگ تر يا مساوي 30 درصد، در صورت امکان به صورت online بازسازي مي شود. اگر اين دو درصد را مساوي يکديگر تنظيم کنيد، فقط بازسازي روي خواهند داد. تنظيم @onlineOnly با 1بدين معني است که قصد داريد فقط بازسازي هاي online را انجام دهيد. تنظيم اين مقدار با 0 موجب خواهد شد ايندکس ها در صورت امکان به صورت online ساخته شوند، در غير اين صورت به صورت offline ساخته مي شوند. @reorgNonOnline در صورت تنظيم با 1 به همراه @onlineOnly که با 1 تنظيم شده است، به ايندکس ها اجازه مي دهد که نتوانند بازسازي شوند. اگر تمام ايندکس هاي شما بتوانند سازمان دهي مجدد شوند، @globalAllowReargs را اضافه کرده ام تا ايمني ناموفق نهايي باشد که اجازه مي دهد سازمان دهي هاي مجدد در مقياس جهاني روي دهند. در محيط من، مطلقاً حياتي است که برخي ايندکس ها مجدداً سازمان دهي نشوند. اگر تمام ايندکس هاي شما بتوانند سازمان دهي مجدد شوند، @globalAllowReargs مي تواند با 1 تنظيم شود. سرانجام،DB Maint-Blocking Killer حاوي يک مرحله است که شامل يک رويه ذخيره شده است که دو پارامتر را مي پذير. @blockingMins تعداد دقايقي است که يک SPID به عنوان بلوکه شده تشخيص داده شده است. اين کار هر دقيقه اجرا مي شود و بررسي بلوکه شدن را انجام مي دهد. اگر SPID را بيابد که يک عمليات ايندکس را انجام مي دهد، @blockingMins را در يک رديف بلوکه مي کند و SPID را مي کشد. براي تعريف بلوکه کردن، پارامتر @blockingProcesses را اضافه کرده ام. اگر SPID بلوکه شده بيش از فرآيندهاي @blockingProcesses بلوکه شده باشد، خاطي در نظر گرفته شده و تعداد بلوکه آن تکرار مي شود. به خاطر زمان و فضا، در اين مقاله، مستندات جامع کد توصيف کننده هر مرحله و پارامترهاي آن ها را نياورده ام. هنگام پيکربندي DB-Maint Index Maint طبق سليقه خود، تعيين زمان بندي را داشته باشيد، مطمئن شويد که آن را در SSMS با کليک راست روي کار و انتخاب Enable فعال کرده ايد.
بازسازي ايندکس ها به صورت Online
حداقل کردن کارآيي ايندکس: به دليل اين که عمليات بازسازي به عنوان تراکنشي مستقل روي مي دهد، rollback تحميلي از کشتن بازسازي offline روي يک ايندکس بزرگ که در حال تکميل است، خيلي بدتر از اجازه دادن به ادامه آن عمليات است. اين راه حل به شما اجازه مي دهد حداکثر کارآيي را در مورد ايندکس هاي خود بدون اجبار در قرباني کردن چيزي داشته باشيد. من نتوانستم عملکردي را به اين کار اضافه کنم، ولي تشخيص دادم که هيچ کاري به طور کامل در تمام برنامه ها نوشته نمي شود، يا به کار گرفته نمي شود. در اين کد، به تعدادي توضيح توجه خواهيد کرد که در توسعه حداقل هستند. اين ها تعدادي پارامتر اضافي هستند که مي توانند استفاده شوند، توسعه يابند يا حذف شوند تا اين کار طبق محيط شما طراحي شود. من اميدوارم اين کار ايندکس به شما کمک کند به سادگي بازسازي ايندکس ها را به صورت online انجام دهيد. منبع:ماهنامه ي رايانه شماره 188  





این صفحه را در گوگل محبوب کنید

[ارسال شده از: راسخون]
[مشاهده در: www.rasekhoon.net]
[تعداد بازديد از اين مطلب: 601]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن