View Full Version : سوال: حجم اطلاعات بالا و کاهش سرعت ... راهکار ؟؟
amin_alexi
شنبه 28 اردیبهشت 1387, 10:20 صبح
من داخل برنامه یک Query از DataBase میگریم که شامل 8 تا 10 تا Join بین جداول مختلف ...
وتعداد رکوردها بازگشتی بین 150000 تا 250000 میشه ... واسه گزارش که از این باید استفاده کنم ... ویک سری فیلترینگ و غیره که انجام میدم .... خلاصه SQL رو هم سعی کردم بهینه کنم ولی حجم بالاست .... و وقتی که چند تا Client به Server وصل میشن و گزارشهایی میگیرن همه از سرعت شاکی میشن !!!! من از AdoConnection و AdoQuery استفاده میکنم ...
من دنبال راه کار می گردم ... تا سرعت بالا بره ...
آیا سرعت به خاطر سنگینی Query ه و به خاطر اینکه ارتباط به صورت دائم با Server برقراره !!!
1 . میخوام بدونم ... آیا اگه از ClientDataSet استفاده کنم سرعت بهتر میشه به شرطی که DisConnected کار کنم ... و اطلاعات رو که گرفتم Connection رو Close کنم ...
آیا سرعت بالا میره ؟
آیا تعدادConnectionهای متصل به SQLServer سرعت رو خیلی کم میکنه !!!
zman123456
شنبه 28 اردیبهشت 1387, 12:00 عصر
ایندکس گذاری کردی؟
amin_alexi
شنبه 28 اردیبهشت 1387, 12:08 عصر
ایندکس (منظورتون روی جداول) !!!
نه اندکس نذاشتم !!!
amin_alexi
یک شنبه 29 اردیبهشت 1387, 09:02 صبح
کسی نیست راهنمایی کند !!!
ممنون میشم !!!
vcldeveloper
دوشنبه 30 اردیبهشت 1387, 00:55 صبح
کسی نیست راهنمایی کند !!!
یکی از بهترین کارهایی که می تونید انجام بدید، همونی هست که در پست #2 مطرح شد.
amin_alexi
دوشنبه 30 اردیبهشت 1387, 08:42 صبح
به غیر از Index که اون کار رو هم انجام میدم ....
یعنی استفاده از ClientDataSet بار Server رو کم میکنه یا نه !!
آیا میشه اطلاعات رو در سمت Client قرار داد (به صورت XML) و وقتی کاربر گزارش جدید میگیره فقط اطلاعات جدید واسش Load بشه !؟؟
m-khorsandi
دوشنبه 30 اردیبهشت 1387, 09:31 صبح
من داخل برنامه یک Query از DataBase میگریم که شامل 8 تا 10 تا Join بین جداول مختلف ...
وتعداد رکوردها بازگشتی بین 150000 تا 250000 میشه ... واسه گزارش که از این باید استفاده کنم ... ویک سری فیلترینگ و غیره که انجام میدم .... خلاصه SQL رو هم سعی کردم بهینه کنم ولی حجم بالاست .... و وقتی که چند تا Client به Server وصل میشن و گزارشهایی میگیرن همه از سرعت شاکی میشن !!!! من از AdoConnection و AdoQuery استفاده میکنم ...
آیا تعدادConnectionهای متصل به SQLServer سرعت رو خیلی کم میکنه !!!
بدست آوردن يكدفعه 150000 تا 250000 ركورد صحيح نيست.
مسلماً تعداد Connectionها به SQL Server مهم هستند و هر كدوم هم فضايی رو ميگيرند ولی تا موقعی كه درخواستهای سنگين نداشته باشند مشكلی ايجاد نميكنند.
اصولاً موارد زير رو برای DBهای SQL Server بايد در نظر بگيری:
Index گذاری مناسب
استفاده از File Groupها
ReIndexing در فواصل زمانی معين
حذف فيلدهای غير ضروری در Query
استفاده از Stored Procedure
....
اول ايندكس گذاری كن و نتيجه رو ببين.
معمولاً توی اين حجم داده، اطلاعات رو يكدفعه واكشی نميكنند.
Borland-Delphi7
دوشنبه 30 اردیبهشت 1387, 15:00 عصر
یه clientdataset و یک dataset provider بزار رو فرم خاصیت providername مربوط به clientdataset رو بزار نام datasetprovider و خاصیت dataset مربوط به datasetprovider رو بزار نام adoquery بعد با client dataset مانند adoquery برخورد کن یعنی گرید و گزارشاتتو وصل کن بهش بعد تفاوت سرعت لود اطلاعات رو ببین 1 به 7 میشه
Borland-Delphi7
دوشنبه 30 اردیبهشت 1387, 15:05 عصر
1 . میخوام بدونم ... آیا اگه از ClientDataSet استفاده کنم سرعت بهتر میشه به شرطی که DisConnected کار کنم ... و اطلاعات رو که گرفتم Connection رو Close کنم ...
آیا سرعت بالا میره ؟
!!!
بله مطمئن باش
آیا تعدادConnectionهای متصل به SQLServer سرعت رو خیلی کم میکنه !!!
اگر کرسر کانکشنت useclient باشه هیچ ربطی به تعداد کانکشنت نداره
vcldeveloper
دوشنبه 30 اردیبهشت 1387, 20:30 عصر
. میخوام بدونم ... آیا اگه از ClientDataSet استفاده کنم سرعت بهتر میشه به شرطی که DisConnected کار کنم ... و اطلاعات رو که گرفتم Connection رو Close کنم ...
اون دوستی که ادعا کرده در صورت استفاده از ClientDataset سرعت 7 برابر (!!) میشه، ظاهرا توجه نکرده که ClientDataset از طریق DatasetProvider داره داده ها را از AdoQuery میگیره، یعنی باز هم این AdoQuery هست که به سرور بانک اطلاعاتی متصل میشه. یکی از کاربردهای اصلی ClientDataset ارائه یک معماری 3-لایه برای ارتباط با بانک اطلاعاتی هست.
نتیجه: صرفا استفاده کردن از ClientDataSet تاثیری در سرعت کار با بانک اطلاعاتی نداره.
SYNDROME
دوشنبه 30 اردیبهشت 1387, 20:53 عصر
استفاده از File Groupها
چطور باید این کار را انجام داد؟
موفق باشید
m-khorsandi
سه شنبه 31 اردیبهشت 1387, 09:45 صبح
قبل از اينكه از File Groupها استفاده كنی، بايد دليل استفاده رو بدونی.
ملاك اصلی برای ساختن File Groupها Join شدن جداول هست؛ آيا اين جداول زياد با هم Join ميشوند؟ تا با استفاده از نتيجه اين سئوال اطلاعات غيرقابل جستجو رو از اطلاعات قابل جستجو جدا كرد، مثلا فيلدهای Image.
در مورد نحوهی استفاده از File Groupها در Books on Line خيلی خوب توضيح داده شده.
amin_alexi
شنبه 04 خرداد 1387, 09:13 صبح
من از ClientDataSet استفاده کردم و نتیجه دقیقا 1 به 7 شد !!!
7 برابر سرعت پایین اومد !!!
می خوام بدونم اگه اطلاعات رو خوندم و سمت Client ذخیره کردم ... بار بعد که طرف خواست گزارش بگیره ... این اطلاعات رو از فایل Load میکنم !!
میشه کاری کرد که اطلاعاتی که جدیدا اضافه شده رو به ClientDataُSet اضافه کنم و ClientDataSet دوباره کل اطلاعات رو از اول از Server نگیره !!!؟
ClientDataSet همچین قابلیتی داره !!!؟
یا باید یه مکانیسم خودم استفاده کنم !!! (مثلا دستی File ذخیره شده رو Update کنم )
Borland-Delphi7
شنبه 04 خرداد 1387, 13:51 عصر
اون دوستی که ادعا کرده در صورت استفاده از ClientDataset سرعت 7 برابر (!!) میشه، ظاهرا توجه نکرده که ClientDataset از طریق DatasetProvider داره داده ها را از AdoQuery میگیره، یعنی باز هم این AdoQuery هست که به سرور بانک اطلاعاتی متصل میشه. یکی از کاربردهای اصلی ClientDataset ارائه یک معماری 3-لایه برای ارتباط با بانک اطلاعاتی هست.
نتیجه: صرفا استفاده کردن از ClientDataSet تاثیری در سرعت کار با بانک اطلاعاتی نداره.
مدیر ارشد درسته که ClientDataset از طریق DatasetProvider داره داده ها را از AdoQuery میگیره، ولی شما تستش بکن ببین با AdoQuery به صورت تنها چقدر فرق داره .
amin_alexi
شنبه 04 خرداد 1387, 14:38 عصر
من تست کردم !!!
دارم میگم 7 برابر طول میکشه !!! هر دو رو وصل کردم به یک DBGrid و Time گرفتم !!
حدودا ClientDataSet 7 برابر کندتر عمل می کنه !!!
چون داره اطلاعات AdoQurey رو میگیره با استفاده از یک واسط به اسم DataProvider ... و بعد ساختارشو عوض میکنه و میاره تو حافظه !!!
فایل XML تولید شده با AdoQuery با ClientDataSet متفاوته من تست کردم !
همین عاملها سرعت رو کم میکنه ...
آخر هم جواب منو ندادین !!!
می خوام بدونم اگه اطلاعات رو خوندم و سمت Client ذخیره کردم ... بار بعد که طرف خواست گزارش بگیره ... این اطلاعات رو از فایل Load میکنم !!
میشه کاری کرد که اطلاعاتی که جدیدا اضافه شده رو به ClientDataُSet اضافه کنم و ClientDataSet دوباره کل اطلاعات رو از اول از Server نگیره !!!؟
ClientDataSet همچین قابلیتی داره !!!؟
یا باید یه مکانیسم خودم استفاده کنم !!! (مثلا دستی File ذخیره شده رو Update کنم )
vcldeveloper
یک شنبه 05 خرداد 1387, 03:37 صبح
مدیر ارشد درسته که ClientDataset از طریق DatasetProvider داره داده ها را از AdoQuery میگیره، ولی شما تستش بکن ببین با AdoQuery به صورت تنها چقدر فرق داره .
اگر قبلا باهاش کار نکرده بودم که پست نمیزدم! ClientDataset مزایای بسیاری داره، ولی آچار فرانسه نیست که برای هر چیزی ازش استفاده بشه. از طرفی برای کار باهاش هم باید نحوه کار آن را بدانید.
ali_habibi1384
یک شنبه 05 خرداد 1387, 05:05 صبح
من فکر میکنم بالا بودن تعداد اتصالات به سرورتون سرعت اطلاعات رو کم کرده. میتونید لینک مستقیم برای داده هاتون درست نکنید . یعنی داده اتون رو بخونید و قطع بشید تا شبکه شلوغ نشه و مجدد برای درج وصل بشید و اطلاعات رو درج کنید و دوباره اتصال رو ببندید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.