PDA

View Full Version : دریافت نتیجه یک stored procedure که شامل چند select می باشد ؟؟!!



FatemehB
دوشنبه 19 فروردین 1387, 14:22 عصر
سلام
من یک stored procedure دارم که چندین select رو بر می گرداند.
کد زیر نتیجه را با تاخیری 2 تا 3 برابر بیشتر از زمانی که به طور مستقیم آن را از SQL Server اجرا می کنم، به من بر می گرداند!




DataSet dsCountry=new DataSet();
SqlConnection cnn=PublicValues.NewDefaultConnection;
SqlCommand cmd=new SqlCommand();
cmd.Connection=cnn;
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="rep_GeneralInfo_Country";

cmd.CommandTimeout=96000;

SqlDataAdapter adCountry=new SqlDataAdapter();
adCountry.SelectCommand=cmd;
adCountry.Fill(dsCountry);
return dsCountry;


غیر از این روش آیا راه دیگری نیز هست؟ در غیر این صورت به نظر شما این تاخیر از کجا ناشی می شود؟
در ضمن اطلاعات مورد بازیابی میلیونی می باشد!

با تشکر

KavoshGar_ir
دوشنبه 19 فروردین 1387, 20:56 عصر
سلام
من یک stored procedure دارم که چندین select رو بر می گرداند.
کد زیر نتیجه را با تاخیری 2 تا 3 برابر بیشتر از زمانی که به طور مستقیم آن را از SQL Server اجرا می کنم، به من بر می گرداند!




DataSet dsCountry=new DataSet();
SqlConnection cnn=PublicValues.NewDefaultConnection;
SqlCommand cmd=new SqlCommand();
cmd.Connection=cnn;
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="rep_GeneralInfo_Country";

cmd.CommandTimeout=96000;

SqlDataAdapter adCountry=new SqlDataAdapter();
adCountry.SelectCommand=cmd;
adCountry.Fill(dsCountry);
return dsCountry;

غیر از این روش آیا راه دیگری نیز هست؟ در غیر این صورت به نظر شما این تاخیر از کجا ناشی می شود؟
در ضمن اطلاعات مورد بازیابی میلیونی می باشد!

با تشکر
stored procedure ها معمولا برای اولین بار توسط sql server کش می شوند که فکر می کنم این تاخیر زمانی بدین خاطر است ولی پس از استفاده مجدد نسبتا تاخیر کمتری دارند.

FatemehB
سه شنبه 20 فروردین 1387, 08:15 صبح
stored procedure ها معمولا برای اولین بار توسط sql server کش می شوند که فکر می کنم این تاخیر زمانی بدین خاطر است ولی پس از استفاده مجدد نسبتا تاخیر کمتری دارند.

دوست عزیز ممنون از توجهی که کردید، ولی من مشکلم چیز دیگری است
اگر یه بار دیگه بخونید ممنون میشم

chaalesh
سه شنبه 20 فروردین 1387, 10:28 صبح
میشه بیشتر توضیح بدی
به بخش sql ربط نداره ؟
بهتر نیست در این زمینه نظر آقای امین ثباتی را هم جویا شوید؟

e-shahshahani
سه شنبه 20 فروردین 1387, 13:53 عصر
در ضمن اطلاعات مورد بازیابی میلیونی می باشد!

اگر منظورتون اینه که تعداد سطر ها میلیونی است، باید تعداد مشخصی از سطر ها را که می خواهید نمایش دهید، برگردانید نه همه آنها را.

در ضمن در sql وقتی دستور select بزرگی را اجرا می کنید ممکن است زمان اجرای کامل آن چندین ثانیه طول بکشد ولی به تدریج اطلاعات را نمایش می دهد در حالیکه هنوز کارش تموم نشده، برای همین فکر می کنید دو سه برابر سریع تره.

امیدوارم چیز به درد بخوری گفته باشم

FatemehB
چهارشنبه 21 فروردین 1387, 08:38 صبح
اگر منظورتون اینه که تعداد سطر ها میلیونی است، باید تعداد مشخصی از سطر ها را که می خواهید نمایش دهید، برگردانید نه همه آنها را.

در ضمن در sql وقتی دستور select بزرگی را اجرا می کنید ممکن است زمان اجرای کامل آن چندین ثانیه طول بکشد ولی به تدریج اطلاعات را نمایش می دهد در حالیکه هنوز کارش تموم نشده، برای همین فکر می کنید دو سه برابر سریع تره.

امیدوارم چیز به درد بخوری گفته باشم

دوست عزیز ممنون از توجهی که کردید
شاید من واضح توضیح ندادم
ببینید من یک Stored Procedure دارم که براساس شرایطی یک سری جدول را به من برمی گرداند.
پایان این عملیات در SQL Server حدود 4 دقیقه هست ولی این زمان در صورتی که از طریق برنامه اجرا بگیریم به حدود 20 دقیقه(!) می رسد!!!

e-shahshahani
چهارشنبه 21 فروردین 1387, 09:52 صبح
اگر منظورتون اینه که تعداد سطر ها میلیونی است، باید تعداد مشخصی از سطر ها را که می خواهید نمایش دهید، برگردانید نه همه آنها را.

شما که در آن واحد به همه چند میلیون سطر داده نیاز ندارید و نمایش همه آن چند میلیون سطر فایده ای ندارد. بهتر است در stored procedure قسمتی از داده ها را که مورد نیاز است برگردانید.
یعنی خودتون paging را مدیریت کنید.

باز هم جواب سوالتون را ندادم که 4 دقیقه کجا و 20 دقیقه کجا! اینو نمی دونم ولی راه حلی که در بالا گفتم نمیگذارد کار به اینجا برسه.
موفق باشید.

FatemehB
چهارشنبه 21 فروردین 1387, 12:00 عصر
اگر منظورتون اینه که تعداد سطر ها میلیونی است، باید تعداد مشخصی از سطر ها را که می خواهید نمایش دهید، برگردانید نه همه آنها را.


مسلم هست که به تمام سطرها نیازی ندارم و در نتیجه تنها نتیجه ای که روی این سطر ها اعمال میشه رو می خواهم و برمی گردونم
یعنی کل select های من شامل چند تا سطر بیشتر نیست(در کل 25 سطر)
برای خودم هم عجیبه که چرا اجرای این stored procedure در برنامه و SQL Server اینقدر فرق داره!!!

e-shahshahani
چهارشنبه 21 فروردین 1387, 12:23 عصر
به نظرم دستور select که نوشتید یک قسمت where دارد که شرطی که آنجا انجام می شود وقت گیر است. آیا فیلد هایی که در شرط بررسی می شود را ایندکس کرده اید؟

Neo Persian
چهارشنبه 21 فروردین 1387, 12:33 عصر
به نظر من خیلی طبیعی هم هست که QUERY گرفتن دورن خود SQL و نمایش نتیجه با QUERY گرفتن از درون برنامه سریعتره! هر چند که از SP استفاده میکنید، SP فقط سرعت عملیات رو درون خود SQL بالا میبره

درون برنامه، شما یک Dataset تعریف کردین که به نظر من برای میلیون ها رکورد اصلا مناسب نیست، سپس یک اتصال به بانک دارید و SP مورد نطر رو صدا میکنید و منتظر جواب می مونید بعد از گرفتن جواب Dataset رو پر میکنید و احتمالا به یک گرید Bind میکنید

مشخصه که زمان بیشتری برای این عملیات صرف میشه!

ُ

FatemehB
چهارشنبه 21 فروردین 1387, 12:42 عصر
بله
ایندکس ها را ساختم، فقط موندم که چرا اجرا توی این دو محیط اینقدر باهم فرق می کنه!
راه دیگری توی .net بجز استفاده از DataAdapter هست که بتونم نتیجه رو بگیرم؟

FatemehB
چهارشنبه 21 فروردین 1387, 12:59 عصر
به نظر من خیلی طبیعی هم هست که QUERY گرفتن دورن خود SQL و نمایش نتیجه با QUERY گرفتن از درون برنامه سریعتره! هر چند که از SP استفاده میکنید، SP فقط سرعت عملیات رو درون خود SQL بالا میبره

درون برنامه، شما یک Dataset تعریف کردین که به نظر من برای میلیون ها رکورد اصلا مناسب نیست، سپس یک اتصال به بانک دارید و SP مورد نطر رو صدا میکنید و منتظر جواب می مونید بعد از گرفتن جواب Dataset رو پر میکنید و احتمالا به یک گرید Bind میکنید

مشخصه که زمان بیشتری برای این عملیات صرف میشه!

ُ

دوست عزیز من گفتم فقط داده ها میلیونی هستند و نتیجه نهایی 25 سطر هست که فقط اینها برگردونده می شود نه کل داده ها!

e-shahshahani
چهارشنبه 21 فروردین 1387, 13:15 عصر
ایندکس ها را ساختم
با ساختن ایندکس سرعت اجرا در sql چقدر متفاوت شد؟ ببخشید کنجکاو شدم!


راه دیگری توی .net بجز استفاده از DataAdapter هست که بتونم نتیجه رو بگیرم؟
SqlDataReader


private static void ReadOrderData(string connectionString)
{
string queryString =
"SELECT OrderID, CustomerID FROM dbo.Orders;";

using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlCommand command =
new SqlCommand(queryString, connection);
connection.Open();

SqlDataReader reader = command.ExecuteReader();

// Call Read before accessing data.
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",
reader[0], reader[1]));
}

// Call Close when done reading.
reader.Close();
}
}

اگر می خواهی یک datatable را با reader پر کنی :

dt.Load(reader);

FatemehB
چهارشنبه 21 فروردین 1387, 15:15 عصر
با ساختن ایندکس سرعت اجرا در sql چقدر متفاوت شد؟

راستش خیلی زمان کمتر شد. بهتره بگم اصلا بدون ایندکس این گزارش بدرد نمی خوره. زمان دقیق قبل از ایندکس رو ندارم چون اینقدر طول می کشید که منتظر نتیجه نمی شدم.

در مورد DataReader هم چون یک روش Connect به دیتابیس هست فکر کنم زمان بیشتر بشه ولی دیتاست که disconnect هست کوئری رو اجرا می کنه و فقط نتیجه بر گردانده می شه!
ولی باز امتحان می کنم. ممنون

FatemehB
دوشنبه 26 فروردین 1387, 14:34 عصر
سلام

با dataReader هم مشکل حل نشد!

e-shahshahani
دوشنبه 26 فروردین 1387, 14:41 عصر
اگر ممکنه متن sp را بگذارید اینجا

FatemehB
سه شنبه 27 فروردین 1387, 10:55 صبح
اگر ممکنه متن sp را بگذارید اینجا
ممنون که این همه توجه دارید.

ببینید این sp خیلی مفصله ولی در نهایت حدود 23 تا جدول رو برمی گردونه!
لازمه بگم که وقتی داده ها براساس پارامتر فرستاده شده کم باشند، این گزارش خیلی سریع کار می کنه ( هم توی SQL Server هم در برنامه )
ولی زمانی که پارامتر ارسالی باعث میشه داده ها زیاد شوند (که در SQL Server حدود 5 دقیقه طول میکشه) زمان همین کار از طریق برنامه به نیم ساعت میرسه!