View Full Version : مشکل در زمان زیاد باز شدن برنامه با حجم دیتابیس زیاد
nasr
چهارشنبه 02 آبان 1386, 13:35 عصر
سلام
من برنامه ای نوشته ام که تعداد جداول اون زیاده و نیز تعداد رکوردهای اون هم بالاست
دیتابیس SQL Server است.
وقتی برنامه می خواد باز بشه روی سرور حدود 10 ثانیه طول میکشه
ولی روی سیستمهای دیگه که برنامه را باز می کنم حدود 8 دقیقه طول میکشه تا باز بشه
و نیز زمانی که جدول ها می خواند Active=True بشند خیلی طول میکشه
و حالا واقعا مشکل بدی شده برای این برنامه
شما چه راهی پیشنهاد می کنید برای مشکل من؟
و اصولا برنامه های حسابداری که توی بازار هست با این همه رکوردی که داره به راحتی و سرعت زیاد باز میشند دلیلش چیه؟
ممنون
vcldeveloper
چهارشنبه 02 آبان 1386, 15:41 عصر
اصولا برنامه های حسابداری که توی بازار هست با این همه رکوردی که داره به راحتی و سرعت زیاد باز میشند دلیلش چیه؟
دلیلش اینه که همه جدول ها و همه رکوردهای موجود در آنها را یکدفعه با هم نیاز ندارند که بخوان همه بانک اطلاعاتی را یکجا از سرور بگیرند و در حافظه کلاینت انبار کنند!
قبلا درباره این موضوع توضیح داده شده، مطالب زیر گروه بانک های اطلاعاتی دلفی را مرور کنید.
nasr
چهارشنبه 02 آبان 1386, 16:22 عصر
دلیلش اینه که همه جدول ها و همه رکوردهای موجود در آنها را یکدفعه با هم نیاز ندارند که بخوان همه بانک اطلاعاتی را یکجا از سرور بگیرند و در حافظه کلاینت انبار کنند!
قبلا درباره این موضوع توضیح داده شده، مطالب زیر گروه بانک های اطلاعاتی دلفی را مرور کنید.
ضمن تشکر
من زیاد سرچ کردم ولی موردی پیدا نکردم
اگه شما لطف کنید لینک یه نمونه اینطوری برای من بگذارید ممنون میشم
ghabil
چهارشنبه 02 آبان 1386, 16:34 عصر
مثلا این یک نمونش (http://barnamenevis.org/forum/showthread.php?t=56466)
ghabil
پنج شنبه 03 آبان 1386, 17:40 عصر
با اجازت با اینکه ادامه سوال رو حصوصی پرسیده بودی عمومی جواب میدم که اگر بعدا کس دیگه ای هم به مشکل خورد بتونه جستجو کنه :
راستش مطلب کلی زیاد هست و توی اینترنت هم سورس زیاد هست کتاب هم توی بازار زیاد هست ، منتها بطور خاص بنظر میاد مشکل تو اینه که همون اول همه اطلاعات رو از سرور میگیری و چون زیاد هستند به این مشکل میخوری ، خب سعی کن زمانی که به اطلاعات احتیاج داری Query بزنی و Queryهات رو هم تا حد ممکن آپتیمایز شده بزنی ، حتی میتونی کوئریهات رو ببری توی Query Analyzer تا متوجه بشی مشکلت کجاست ، شاید بعضی جاها نیاز به ایندکس داری ....
یک نکنه دیگه هم بگم ، اصلا TTABLE و TADOTable برای کارهای حرفه ای نیستند و فقط به درد کارهای کوچیک و امتحانی میخورند ، چون کل اطلاعهات رو میارند در حالیکه خیلی خیلی به ندرت پیش میاد که همه اطلاعات لازم باشه و فقط باید رکوردهایی که در لحظه کاربر بهشون احتیاج داره رو بیاری.
Saeid59_m
یک شنبه 06 آبان 1386, 07:22 صبح
اصلا TTABLE و TADOTable برای کارهای حرفه ای نیستند
پس از چی استفاده کنیم . لطفاً راهنمائی کنید .
nasr
یک شنبه 06 آبان 1386, 07:45 صبح
باید با استفاده از AdoQuery اطلاعات مورد نظر را فراخوانی کنید
ghabil
یک شنبه 06 آبان 1386, 09:36 صبح
ADODataSet از AdoQuery هم بهتره قبلا توضیح داده شده اگر جستجو کنید.
Saeid59_m
یک شنبه 06 آبان 1386, 10:53 صبح
من تو برنامه هام یه DataMoudle قرار می دم و توی اون AdoConnection و AdoTableهام رو می گذارم . البته جدولها همیشه بسته هستند .(مگر اوقاتی که بخواهم مستقیم با جدول کار کنم) بعد جاهایی توی فرمها که می خوام لیست گیری کنم از AdoQueryاستفاده می کنم .
این ساختار به نظر شما درسته ؟
و برای برنامه های تحت شبکه مشکلی پیش نمی یاره ؟
ممنون
nasr
یک شنبه 06 آبان 1386, 14:22 عصر
من تو برنامه هام یه DataMoudle قرار می دم و توی اون AdoConnection و AdoTableهام رو می گذارم . البته جدولها همیشه بسته هستند .(مگر اوقاتی که بخواهم مستقیم با جدول کار کنم) بعد جاهایی توی فرمها که می خوام لیست گیری کنم از AdoQueryاستفاده می کنم .
این ساختار به نظر شما درسته ؟
و برای برنامه های تحت شبکه مشکلی پیش نمی یاره ؟
ممنون
خوب معمولا همه همین کار را می کنن. ولی اگه یکی از جدولها حجمش زیاد باشه اونوقته که برای باز شدن اون برنامه قفل میکنه.
vcldeveloper
یک شنبه 06 آبان 1386, 22:30 عصر
خوب معمولا همه همین کار را می کنن. ولی اگه یکی از جدولها حجمش زیاد باشه اونوقته که برای باز شدن اون برنامه قفل میکنه.
شما باید به یک شکلی حجم داده های ارسالی به کلاینت را کنترل کنید.
ممکنه داده های این جدول با یک جدول دیگر در ارتباط باشند و شما بخواید به ازای هر یک از رکوردهای جدول دوم، فقط رکوردهای مربوط به آن را در جدول اول نمایش دهید، برای این کار از رابطه Master\Details استفاده میکنید.
ممکنه فقط به بخشی از داده های جدول نیاز داشته باشید، برای این کار از یک Query که فقط رکوردهای مورد نیاز شما را برمی گرداند، استفاده می کنید.
یا اگر لازم است که کل داده های یک جدول به کاربر نمایش داده شود، رکوردها را با استفاده از یک کوئری بصورت صفحه به صفحه به کاربر نمایش می دهید (مثل همون کاری که این سایت میکنه).
در نهایت اگر حجم داده های جدول محدود باشه، مثلا جداولی که برای Lookup استفاده میشند، جدول را بصورت عادی و بدون محدودیت لود می کنید.
nasr
دوشنبه 07 آبان 1386, 08:01 صبح
در نهایت اگر حجم داده های جدول محدود باشه، مثلا جداولی که برای Lookup استفاده میشند، جدول را بصورت عادی و بدون محدودیت لود می کنید.
مطالبتون کاملا صحیح ولی برای همین مشکل واقعا راه حلی نیست؟
جدولی که قراره برای Lookup استفاده بشه حتما باید Active باشه که همین امر هم یک دردسر دیگه است.
از طرفی برای هر بار Locate کردن از جدول نیز جدول باید Active باشه و اینکه بعد از هر بار تغییر اطلاعات جدول این جدول برای Locate کردن باید Refresh بشه که این هم خودش کلی وقت میگیره.
Saeid59_m
دوشنبه 07 آبان 1386, 10:44 صبح
یا اگر لازم است که کل داده های یک جدول به کاربر نمایش داده شود، رکوردها را با استفاده از یک کوئری بصورت صفحه به صفحه به کاربر نمایش می دهید (مثل همون کاری که این سایت میکنه).
چطور می شه پاسخ یک کوری رو صفحه به صفحه دید
vcldeveloper
سه شنبه 08 آبان 1386, 07:45 صبح
از طرفی برای هر بار Locate کردن از جدول نیز جدول باید Active باشه و اینکه بعد از هر بار تغییر اطلاعات جدول این جدول برای Locate کردن باید Refresh بشه که این هم خودش کلی وقت میگیره.
وقتی حجم داده ها زیاد هست و شما هم همه داده ها را به کاربر نمایش نمی دهید، دیگه نمیشه از Locate استفاده کرد، باید برای جستجو کوئری بنویسید.
چطور می شه پاسخ یک کوری رو صفحه به صفحه دید
درباره اش قبلا بحث شده:
Fetch کردن تدریجی اطلاعات (http://barnamenevis.org/forum/showthread.php?t=77666)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.