Nima_kyan
سه شنبه 06 فروردین 1392, 14:01 عصر
سلام
دوستان من یه جدول با حجم اطلاعاتی بالا دارم (بیش از هفت میلیون رکورد) که یه سری اطلاعات رو میخوام ازش بیرون بکشم که با روشی که خودم انجام دادم محاسباتم بسیار زمان بر خواهد بود.حالا سراغ یه روش بهینه تر میگردم.
فیلدهای جدول:
شماره کارت (FKCard --> int)
زمان (DateTime -->Datetime)
اعتبار قبلی (PreEtebar -->int)
مبلغ (Price --> int)
اعتبار فعلی (RemEtebar -->int)
وقتی مشتری کارت میکشه یه رکورد به این جدول اضافه میشه.
مشکل: بعضی مواقع به دلایل مختلف بعضی رکوردها واسه بانک اطلاعاتی ارسال نمیشه.
گزارشی که من میخوام: مبالغی که ارسال نشدن رو بدست بیارم.
الگوریتم استفاده شده ی خودم:
گروه بندی بر اساس شماره کارت و مرتب سازی بر اساس فیلد زمان و اضافه کردن یه فیلد AutoNumber که به ازای هر کارت از یک شروع میشه و به تعداد کارت کشیدن اون نفر افزایش پیدا میکنه.(یعنی آخرین عدد هر کارت برابر با تعداد کارت کشیدنش)
حالا اومدم با استفاده از یه حلقه تودرتو هر رکورد یه کارت رو با رکورد بعدش مقایسه کردم و در صورت مغایرت فیلد اعتبارفعلی رکورد قبل با فیلد اعتبار قبلی رکورد فعلی مبلغ مغایرت رو محاسبه کرده و به یه جدول مجازی اضافه میکنم که میشه همون نتیجه ای که من میخوام.(ولی با یه هزینه زمانی بسیییار زیاد که به هیچ وجه منطقی نیست)
توضیح حلقه تودرتو:
-حلقه بیرونی به تعداد کارت های ثبت شده تکرار میشه.
-حلقه داخلی به تعداد کارت کشیدن هر کارت تکرار میشه.
مثال:
ردیف شماره کارت اعتبار قبلی مبلغ اعتبار فعلی تاریخ
1 1 1000 100 900 91/10/10 12:25:30
2 1 900 100 800 91/10/10 12:30:30
3 1 700 100 600 91/10/10 12:40:30
وقتی رکورد 2 و 3 رو باهم مقایسه کنیم متوجه میشیم که یک رکورد کاهش اعتبار 100 تومنی ارسال نشده بین این دو رکورد اتفاق افتاده ولی ارسال نشده.
حالا گزارشی که من گرفتم میگه بین این تاریخ و این تاریخ ، این مبلغ ارسال نشده.
الگوریتم استفاده شده ی من جواب درست رو بهم میده ولی با یه هزینه زمانی بسیار بالا.
حالا میخوام یه الگوریتم سریعتر پیدا کنم؟؟؟؟؟
دوستان ممنون میشم الگوریتم بهتری پیشنهاد کنید.
دوستان من یه جدول با حجم اطلاعاتی بالا دارم (بیش از هفت میلیون رکورد) که یه سری اطلاعات رو میخوام ازش بیرون بکشم که با روشی که خودم انجام دادم محاسباتم بسیار زمان بر خواهد بود.حالا سراغ یه روش بهینه تر میگردم.
فیلدهای جدول:
شماره کارت (FKCard --> int)
زمان (DateTime -->Datetime)
اعتبار قبلی (PreEtebar -->int)
مبلغ (Price --> int)
اعتبار فعلی (RemEtebar -->int)
وقتی مشتری کارت میکشه یه رکورد به این جدول اضافه میشه.
مشکل: بعضی مواقع به دلایل مختلف بعضی رکوردها واسه بانک اطلاعاتی ارسال نمیشه.
گزارشی که من میخوام: مبالغی که ارسال نشدن رو بدست بیارم.
الگوریتم استفاده شده ی خودم:
گروه بندی بر اساس شماره کارت و مرتب سازی بر اساس فیلد زمان و اضافه کردن یه فیلد AutoNumber که به ازای هر کارت از یک شروع میشه و به تعداد کارت کشیدن اون نفر افزایش پیدا میکنه.(یعنی آخرین عدد هر کارت برابر با تعداد کارت کشیدنش)
حالا اومدم با استفاده از یه حلقه تودرتو هر رکورد یه کارت رو با رکورد بعدش مقایسه کردم و در صورت مغایرت فیلد اعتبارفعلی رکورد قبل با فیلد اعتبار قبلی رکورد فعلی مبلغ مغایرت رو محاسبه کرده و به یه جدول مجازی اضافه میکنم که میشه همون نتیجه ای که من میخوام.(ولی با یه هزینه زمانی بسیییار زیاد که به هیچ وجه منطقی نیست)
توضیح حلقه تودرتو:
-حلقه بیرونی به تعداد کارت های ثبت شده تکرار میشه.
-حلقه داخلی به تعداد کارت کشیدن هر کارت تکرار میشه.
مثال:
ردیف شماره کارت اعتبار قبلی مبلغ اعتبار فعلی تاریخ
1 1 1000 100 900 91/10/10 12:25:30
2 1 900 100 800 91/10/10 12:30:30
3 1 700 100 600 91/10/10 12:40:30
وقتی رکورد 2 و 3 رو باهم مقایسه کنیم متوجه میشیم که یک رکورد کاهش اعتبار 100 تومنی ارسال نشده بین این دو رکورد اتفاق افتاده ولی ارسال نشده.
حالا گزارشی که من گرفتم میگه بین این تاریخ و این تاریخ ، این مبلغ ارسال نشده.
الگوریتم استفاده شده ی من جواب درست رو بهم میده ولی با یه هزینه زمانی بسیار بالا.
حالا میخوام یه الگوریتم سریعتر پیدا کنم؟؟؟؟؟
دوستان ممنون میشم الگوریتم بهتری پیشنهاد کنید.