ورود

View Full Version : نیاز به راه حل برای بهبود سرعت پرکردن node های یک treeview؟



parsidev
چهارشنبه 28 فروردین 1392, 09:46 صبح
با سلام؛
طرح مسئله:
جدولی شامل فیلدهای id,title,parentid برای ذخیره اطلاعات یک نمای درختی n لایه داریم.
جدول ذکر شده دارای حداقل 70 هزار رکورد می باشد.
بهترین پیشنهاد برای پرکردن یک treeview از طریق اطلاعات جدول ذکر شده چیست؟!
ملاک پیشنهاد خوب ، سرعت بالا در لود اطلاعات می باشد.
در حال حاضر این کار بوسیله یک تابع بازگشتی انجام می شود ولی سرعت پرکردن اطلاعات حدود 7 دقیقه می باشد!
ضمنا زبان برنامه نویسی مورد استفاده دلفی (نسخه 7!!) می باشد.
سپاس از وقتی که می گذارید.

samani
چهارشنبه 28 فروردین 1392, 17:52 عصر
سلام
شما ميتونيد از كامپوننتهاي آماده مثل dxDBTreeView مربوط به DevExpress كه از سرعت خوبي برخورداره استفاده كني
كه سرعت لود آن در 96 هزار ركورد (تقسيمات كشوري) حدود 15 تا 20 ثانيه است

اما اگر ميخواهيد خودتان با Treeview پياده سازي كنيد يكي از گزينه ها به نظر من پياده سازي به شكل LazyLoad هست به اين طريق كه شما در مرحله اول اولين نودها رو كه ParentID آنها در ID وجود ندارد به درختواره اضافه ميكنيد و بعد از آن بر اساس نود انتخاب شده توسط كاربر فرزندان آن رو اضافه ميكنيد يا اينكه با يك Thread از اطلاعات لود شده شروع به ترسيم درختواره ميكنيد

لازم به ذكر است كه نحوه خواندن اطلاعات از بانك اطلاعاتي خيلي مهم است. براي مثال خواندن اطلاعات تقسيمات كشوري از بانك اطلاعاتي كه حدود 96 هزار ركورد هست كمتر از 1 ثانيه است به شرط اينكه شما فقط فيلدهاي لازم رو Select كنيد و از Order by ParentID, ID استفاده كنيد و نوع فيلدهاي ID, ParentID اگر از نوع عددي باشند در سرعت ترسيم درختواره تاثير گذار هست ويا اينكه قبل از Open كردن Table يا Query از DisableControls استفاده كنيد

parsidev
چهارشنبه 28 فروردین 1392, 20:45 عصر
سپاس از پاسختون ...
گزینه دوم رو تست خواهم کرد.
اما درباره گزینه اول , آیا این قابلیت رو داره که اطلاعات رو از جدولی با فیلدهای id,title,parentid که برای ذخیره نمای درختی کاربرد داره , بخونه و نمایش بده؟
سپاس مجدد

samani
پنج شنبه 29 فروردین 1392, 09:12 صبح
اگر منظورتون از گزينه اول كامپوننت dxDBTreeView هستش پاسخ بله هست
مثال تقسيمات كشوري رو كه عرض كردم حداقل 6 سطحي است (كشور/استان/شهرستان/بخش/شهر يا دهستان/روستا)
البته نمايش اين كامپوننت چپ به راست است كه با يه تغييرات جزئي در سورس ميتونيد راست به چپ كنيد
موفق باشيد.