ورود

View Full Version : deadLock



Accidentboy
چهارشنبه 28 فروردین 1387, 21:01 عصر
سلام
من حدود 800 تا جدول دارم
یه query که به 100 تا شون جوین که محاسبات رو انجان میده که تو شبکه در حدود 14 ساعت طول میکشه انجام بشه در بعضی مواقع پیغام deadlock می ده

به نظر شما من چی کار می تونم انجام بدم

Amir_Safideh
چهارشنبه 28 فروردین 1387, 21:51 عصر
به نظر شما من چی کار می تونم انجام بدم این همه جدول و این همه ارتباط بین جداول واقعا برای چی هست ؟
من فکر میکنم که اگر بخواهید توضیح هم بدید باید کلی انرژی بزارید برای توضیح در مورد ضرورت وجود این همه جداول و ارتباطات . ولی برای قدم اول بهتره سعی کنید که تعداد جداول و ارتباطات بین جداول رو کم کنید یعنی اینکه اطلاعات رو در تعداد جداول کمتری متمرکز کنید . یکی از دلایل عمده کاهش سرعت در گزارشگیری ارتباطات زیاد بین جداول هستش . کار دیگه ای که میتونید بکنید اینه که ساختار جداولتون رو بهینه کنید . از ایندکسهای مناسب استفاده کنید .
-------------
موفق باشید .

AminSobati
چهارشنبه 28 فروردین 1387, 23:17 عصر
دوست عزیزم در درجه اول خود Query رو بهینه کنین و بعد تا جای ممکن با ساختن Index و Indexed View و همچنین ترفندهای Denormalization بازده رو افزایش بدین

Accidentboy
چهارشنبه 28 فروردین 1387, 23:27 عصر
خیلی منون
من تو یه شبکه هستم که میانگین 500 کاریر از برنامه ها استفاده می کنند
در ضمن از طریق منطقی (... ضرب درکارتی) تا تونستم query رو بهنه کردم
به طور مثال برای محاسبه یه قطعه چندین جدول برای محاسبه استفاده می شه یعنی نمی تونم
تعداد جدول رو کاهش برم

راه دیگری نیست

AminSobati
پنج شنبه 29 فروردین 1387, 08:55 صبح
Index و Indexed View

Accidentboy
پنج شنبه 29 فروردین 1387, 09:36 صبح
با درورد فراوان
آقای ثباتی نمیشه قبل از اجرای query جدول های مریوط به اون ها یه جوری قفل کرد یا readonly کرد که برنامه هایی که از اون جدول ها استفاده می کنند داده ها رو update یا insert نکونن
در ضمن میخواستم اگه میشه توضیحی در باره deadlock سیستم عامل انجام میده چه منابعی رو درگبر sql server مکنه ؟

Accidentboy
پنج شنبه 29 فروردین 1387, 13:14 عصر
ببینید دوستان من تمام کار هایی که شما توضیح داد انجام دادم
ار جمله index , indexed view
حتی کمترین or رو روهم انتخاب کردم
qurey که 10 ساعت با پیغام deadlock بسته می شه چیکار کنم

میشه در باره Denormalization اگه منبع مناسبی سراغ دارید می تونید post کنید

Amir_Safideh
پنج شنبه 29 فروردین 1387, 14:50 عصر
من چند تا سایت رو گشتم در مورد مشکل شما . تا اونجا که متوجه شدم این مشکل زمانی ایجاد میشه که دو کاربر همزمان بخوان که ابزار مورد استفاده کاربر دیگه رو Lock کنن در این مواقع اس کیوال به صورت خودکار عملیات درخواستی یکی از کاربر ها رو کنسل میکنه و اروز 1205 رو برای کاربر میفرسته . برای این که خود شما مشخص کنید که اس کیوال سرور در چنین مواقعی ترجیحا درخواست کدوم کاربر رو رد کنه این دستور رو میتونید استفاده کنید SET DEADLOCK_PRIORITY که این دستور چند مقدار میتونه داشته باشه که اگر این دستور رو با مقدار LOW به اس کیو ال بفرستید به معنی اینه که این کوئری رو در چنین مواقعی در اولویت انجام قرار بده و عملیات رد درخواست رو روی کاربر دیگه اعمال میکنه .

SET DEADLOCK_PRIORITY LOW
همین واژه deadlock رو توی اینترنت جستجو کن مطالب خوبی پیدا میکنی . امیدوارم که مشکلت هر چی زودتر رفع بشه .
------------
موفق باشید .

Accidentboy
پنج شنبه 29 فروردین 1387, 14:54 عصر
این post تون خیلی جالب بود

من نمی دونستم sql server این کار رو انجام میده

AminSobati
پنج شنبه 29 فروردین 1387, 17:36 عصر
همه دلیل رخ دادن deadlock صرفا درخواست همزمان Lock نیست! برای درک بهتر به این مثال توجه کنید:
کاربر اول جدول t1 رو Lock کرده و کاربر دوم جدول t2 رو. حالا کاربر اول قصد داره جدول t2 رو هم Lock کنه که چون قبلا در اختیار کاربر دوم قرار گرفته، پس درخواستش Block میشه. هر وقت کاربر دوم جدول t2 رو رها کنه، کاربر اول درخواستش انجام میشه. اما کاربر دوم نه تنها جدول t2 رو آزاد نمیکنه، بلکه میخواد Lock روی t1 بدست بیاره. چون در حال حاضر کاربر اول جدول t1 رو در اختیار داره، پس هر دو کاربر منتظر هم هستند و منطقا این Lock تا روز قیامت ادامه داره!
در اینجا SQL Server یک پروسس داخلی داره که مرتبا وضعیت Lockها رو مانیتور و deadlockهای از این قبیل رو کشف میکنه. زمانی که deadlock دیده شد، SQL Server باید یکی از دو کاربر رو Victim یا قربانی کنه. یعنی تراکنشش Rollback بشه. انتخاب اینکه کدوم کاربر Victim بشه دو ملاک داره:
1) اگر هر دو کاربر در DEADLOCK_PRIORITY یکسان باشند، یعنی یا هر دو Low یا هر دو Normal، در این حالت کسی که تراکنش رو زودتر شروع کرده برنده هست و دیگری Victim میشه.
2) اگر DEADLOCK_PRIORITY یکی Low و دیگری Normal باشه، اونی که Low هست بعنوان Victim انتخاب میشه. بصورت پیش فرض تمام Connectionهای متصل شده به SQL Server در حالت Normal هستند. نکته جالب توجه اینکه حتی روی یک جدول هم دو کاربر میتونن به deadlock برخورد کنند (که از توضیحش میگذریم). در Profiler یک Event برای مانیتور کردن deadlock وجود داره.
و اما در مورد اصل سوال:
ممکنه پیچیدگی Query شما واقعا در حدی باشه که نتونیم در یک تاپیک ساده و تبادل نظر، راه حل ایده آل براش پیدا کنیم. اما آیا یقین دارین Indexها و Indexed Viewهایی که ساختین ازش استفاده میشه و در حالت بهینه قرار دارند؟
اگر براتون مقدوره متن Query رو ارسال کنین. ضمنن کدوم نسخه از SQL Server رو استفاده میکنید؟

Accidentboy
پنج شنبه 29 فروردین 1387, 17:52 عصر
سلام جناب آقای ثباتی
از ارسال متن qurey نمی تونم به شما ارسال کنم
چون از لحاظ امنیتی شرکت به قول خودش خیلی بالا

به طور مثال می خوام وقتی query شروع شد کلیه جدول های اون قفل بشه

دیگه هیچ برنامه ای به این جدول ها به صورت readonly باشه
یه سوال دیگه deadlock رو مگه سیستم عامل انجام نمی ده
ورژن sql server 2000

AminSobati
پنج شنبه 29 فروردین 1387, 18:19 عصر
از ارسال متن qurey نمی تونم به شما ارسال کنم
چون از لحاظ امنیتی شرکت به قول خودش خیلی بالا

کاملا درک میکنم!



یه سوال دیگه deadlock رو مگه سیستم عامل انجام نمی ده

معمولا هر جا که Lock کردن وجود داشته باشه، deadlock هم ممکنه رخ بده. OS هم بعضی منابع رو Lock میکنه ولی موضوعش از SQL Server جداست