PDA

View Full Version : افزايش سرعت اجراي برنامه



happy65_sh
یک شنبه 01 خرداد 1390, 09:15 صبح
سلام
يه كوئري بزرگ دارم كه با اجرا كردنش حدود 30 ثانيه طول ميكشه تا اجرا بشه(ميخواهم يه ديتا تيبل را به كمك يه ديتا آداپتور پر كنم) .روي بعضي از سيستم هايي هم كه برنامه را نصب كرده ام خطاي زير را ميده كه احتمال ميدم به خاطر همين مساله باشه . چه كارهايي انجام بدم تا اين زمان كاهش پيدا كنه و خطا نده.

یوسف زالی
یک شنبه 01 خرداد 1390, 09:40 صبح
بستگی داره کوئری شما چی باشه.
خیلی چیزا سرعت رو پایین میارن.
Cursor
Temp table
Nested Join
isnull
nvarchar
*
و خیلی های دیگه.
یه نمونه بگذار.
اون مشکل هم دقیقا به همین مربوط میشه

TeacherMath
یک شنبه 01 خرداد 1390, 10:41 صبح
سلام.برای بالا بردن سرعت حتما باید از thread استفاده کنید.

happy65_sh
یک شنبه 01 خرداد 1390, 12:07 عصر
سلام و ممنون از دوستان
كد هايي كه نوشته ام قابل كپي نيست(روي سرور محل كارم هست و اجازه ي كپي ندارم)
يه نمونه اينجا مينويسم كه شبيه كدهايي است كه خطا ميده البته نه به اون كاملي چون كوئري كه اونجا دارم وقتي توي word كپي ميكنم نزديك 37تا خط ميشه(با فونت 9.5):


DataTable dt=new DataTable();

String query="select ....";
sqldataadaptor da =new sqldataadaptor(query,Connection);
da.fill(dt);
for(int i=0;i<dt.Rows.Count;i++)
{
com.commandtext="insert into table1 values(@a,@b,@c)";

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][1]);
com.parameters.AddWithValue("@c","مانده1");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][2]);
com.parameters.AddWithValue("@c","مانده 2");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][3]);
com.parameters.AddWithValue("@c","مانده 3");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][4]);
com.parameters.AddWithValue("@c","مانده 4");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][5]);
com.parameters.AddWithValue("@c","مانده 5");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][6]);
com.parameters.AddWithValue("@c","مانده 6");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][7]);
com.parameters.AddWithValue("@c","مانده 7");
co..ExecuteNonQuery();

com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",dt.Rows[i][8]);
com.parameters.AddWithValue("@c","مانده 8");
co..ExecuteNonQuery();

DataTable otheradddt=new DataTable();
SqlDataAdaptor OtherAddDa=new SqlDataAdaptor(queryOtheradd,Connection);
OtherAddDa.SelectCommand.parameters.AddWithValue("@date",MyDate);
OtherAddDa.Fill(otheradddt);
for(int j=0;j<otheradddt.Rows.Count;j++)
{
com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",otheradddt.Rows[j][0]);
com.parameters.AddWithValue("@c",otheradddt.Rows[j][1]);
co..ExecuteNonQuery();
}

DataTable otherkasrdt=new DataTable();
SqlDataAdaptor OtherKasrDa=new SqlDataAdaptor(queryOtherkasr,Connection);
OtherAddDa.SelectCommand.parameters.AddWithValue("@date",MyDate);
OtherKasrDa.Fill(otherkasrdt);
for(int j=0;j<otherkasrdt.Rows.Count;j++)
{
com.parameters.clear();
com.parameters.AddWithValue("@a",dt.Rows[i][0]);
com.parameters.AddWithValue("@b",otherkasrdt.Rows[j][0]);
com.parameters.AddWithValue("@c",otherkasrdt.Rows[j][1]*-1);
co..ExecuteNonQuery();
}

}

كوئري اوليم نزديك 15 تا ستون برميگردونه كه از isnull در همه اش استفاده شده وبعضي از ستون ها توابعي هست كه در sql نوشته ام (12 تا ستون)و join هم 5تا جدول هست يه شرط بيشتر ندارم و تهش هم Groupby بر اساس 10 تا فيلده.
كوئري هاي دوم و سوم ه مunion ي هست از نزديك 10 تا كوئري كه هر كوئري 2 تا ستون بيشتر برنميگردونه و يك ستونش تابع هست.
حلقه ي for اولي مقدار بازگشتيش نزديك 880 تاست البته متغيره ولي حالا كه به اين مقدار رسيده به مشكل برخورده ام.
حلقه هاي for داخلي هم خيلي متغير هستند از 0 تا 100 يا حتي بيشتر.
خوب با اين تفاسير براي بهبود سرعت برنامه و اينكه خطاي timeoutExpired نده بايد چيكار كنم.
البته امروز يه خط كد اضافه كردم و Timeout ديتاآداپتورم كه 30 ثانيه بود (به صورت پيش فرض)را به 120 ثانيه افزايش دادم.هنوز امتحان نكرده ام كه درست جواب ميده يا نه .اما دنبال راهي هستم كه اصولي اين مشكل را حل كنم تا در آينده به مشكلي برنخورم.
ممنون از دوستاني كه وقت گذاشته اند.