PDA

View Full Version : تراکنش بالا رو دیتابیس و دریافت ارور Timeout expired



saeidgab
پنج شنبه 29 اردیبهشت 1390, 18:08 عصر
سلام به همگی، من رو یه پروژه کار می کنم که حجم عملیات دیتابیسش خیلی زیاده. چند تا xml (حداقل 1 و حداکثر 5 مگابایتی ) رو در فاصله های زمانی متفاوت (15 ثانیه تا 15 دقیقه)میخونم(MultiThread) و با مقایسه اونها با اطلاعات دیتابیس ، دیتابیس رو بروزرسانی میکنم. تعداد رکوردهای چند تا از جدولها هم خیلی زیاده که حتی تعداد رکوردهای یکی از اونها به مرور زمان به میلیون میرسه. مشکل اینجاست که به خاطر حجم زیاد کار روی دیتابیس در بعضی مواقع هنگام select زدن از دیتابیس ConnectionTimeOut رخ میده و ارور زیر رو دریافت میکنم:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding


بانک اطلاعاتی Sql 2008 و با Ado.net با sql کار میکنم. مقدار ConnectionTimeOut روی پیش فرضش (15 ثانیه) و با توجه به نوع کار اگر ConnectionTimeOut رو بیشتر از این کنم ،کارایی برنامه پایین میاد(چون بعضی از پروسه ها در فاصله زمانی 15 ثانیه انجام میشه)
سوالم اینه که آیا راهی وجود داره که Timeout expired رخ نده یا کمتر رخ بده؟ یا ممکن من اشتباهی کرده باشم که این ارور رو میگیرم . یا اصلا برای Sql ممکن هست که این حجم تراکنش رو انجام بده یا اینکه من دارم پدرشو در میارم، اونم صداش در میاد!
اگه تجربه ای یا دانشی در این زمینه دارین کمکم کنید خوشحال میشم.

A.Farzin
پنج شنبه 29 اردیبهشت 1390, 23:27 عصر
به نظر من شما دو كار مي‌توانيد انجام دهيد:
اول) با افزايش حجم اطلاعات، نياز است تا در تعريف Indexها تجديد نظر شود چون Indexهايي كه با مثلاً 2 ميليون ركورد از نظر Query Optimizer بهينه تلقي مي‌شود، هيچ دليلي ندارد كه وقتي حجم اطلاعات چند برابر شد، باز هم بهينه باشد. در اين موقع لازم است، ايندكسها مجدداً بهينه شوند.
دوم) من هم چند سال قبل، براي كار روي يك Table حاوي 65 ميليون ركورد با SQL 2000 مشكلاتي شبيه به شما داشتم. مجبور شدم اطلاعات اين Table را بر حسب سال و مقوله به چندين Table ديگر تفكيك كنم تا حجم هر جدول كاهش يابد. در اين حالت، مشكلات برنامه‌نويسي براي انجام Transactionها بيشتر مي‌شود ولي براي من ارزشش رو داشت چون با گذشت زمان حجم اين اطلاعات در حال بيشتر شدن بود. من در واقع اطلاعات اين جداول را در مواقع لزوم با UNION ALL با هم يكي كرده و تغييرات را به كمك TRIGERهاي كه روي View نوشته‌ام به Table مربوطه هدايت مي‌كنم.


... تعداد رکوردهای چند تا از جدولها هم خیلی زیاده که حتی تعداد رکوردهای یکی از اونها به مرور زمان به میلیون میرسه ...
يك ميليون ركوردي كه شما گفتيد داريد كه زياد نيست، براي شما راه حل دوم توصيه نمي‌شود.