PDA

View Full Version : سرعت لود داده ها از جداول SQLبه یک dataset بیشتره یا از یک فایل XML?



amergoli
شنبه 25 دی 1389, 16:27 عصر
با سلام خدمت دوست های گرامی.
من می خوام یه سایت خبری طراحی کنم و فکر کردم که اگه نمایش این سایت به جداول SQL مرتبط نباشه و به جای اون از فایل XML که هر بار پس از آپلود مطالب جدید دوباره به روز میشه استفاده کنم البته از طریق جداول sql!.حالا مخوام بدونم که آیا چنین کاری اساسا راهکاری خوب است به لحاظ سرعت،کارایی و امنیت؟
ممنون میشم که توضیحاتی رو از دوستان اینجا داشته باشم.
با تشکر

mehdi.mousavi
شنبه 25 دی 1389, 19:19 عصر
با سلام خدمت دوست های گرامی. من می خوام یه سایت خبری طراحی کنم و فکر کردم که اگه نمایش این سایت به جداول SQL مرتبط نباشه و به جای اون از فایل XML که هر بار پس از آپلود مطالب جدید دوباره به روز میشه استفاده کنم البته از طریق جداول sql!.حالا مخوام بدونم که آیا چنین کاری اساسا راهکاری خوب است به لحاظ سرعت،کارایی و امنیت؟ ممنون میشم که توضیحاتی رو از دوستان اینجا داشته باشم. با تشکر

سلام.
من نگهداری کلیه داده ها بصورت XML در بانک Relational رو توصیه نمیکنم. اگر RDBMS Engine شما، بصورت بومی XML رو Support می کرد، اوضاع متفاوت بود، اما مثلا در SQL Server این اتفاق نمیفته. اگر منظورتون اینه که کلیه داده ها در جداول بصورت Relational نگهداری بشن، اما با هر بار Update کردن اونها، XML ای از کلیه اون اطلاعات در حافظه نگهداری بشه و بر اساس اون XML داده ها سرو بشه، بازهم چنین چیزی رو توصیه نمیکنم. چون Load کردن یه XML Document در حافظه (حتی فقط برای بار اول) و همینطور جستجو در اون، کار هزینه بر و کندی هستش و وقتی داده های شما زیاد بشه، اونوقت با افت شدیدی در عملکرد سایت روبرو میشید. در نهایت توصیه من این هستش که داده ها رو بصورت Relational در جداول مناسب نگهداری کنید و On Demand داده های مورد نظر رو Query کرده، نشون بدید. البته شاید بد نباشه یه نیم نگاهی نیز به MongoDB، Cassandra و CouchDB (بطور کلی No-SQL DB Engine ها) نیز داشته باشید، اگر اصرار دارید داده ها رو بصورت Relational نگهداری نکنید.

موفق باشید.

amergoli
یک شنبه 26 دی 1389, 15:51 عصر
با تشکر از پاسخ شما.
یکی از دغدغه های من لود صفحه نخست سایت در کمترن زمان ممکن هستش.من فکر کردم که اگه صفحه نخست که دارای عناوینی مشخص هست ،همین عناوین مشخص توسط مدیر به هنگام به روز شدن عناوین اصلی به روز میشه و این فایل دارای حجم بسیار پایینی است که حداکثر شامل 100 رکورد است و این فایل XMLاز نو نوشته میشه.و پرسش اینجاست که با چنین شرایطی ‌‌ آیا بهینه است که منبع جداول موقت سایت این فایل XML باشد یا خیر.آیا تاثیریقابل مشاهده در سرعت لود اطلاعات خواهد داشت یا نه؟چون اگر بخواهیم این اطلاعات را از جداول SQL دریافت کنیم باید طی دستورات و select کردن آنها مورد بازیابی قرار بگیرند حال آنکه در شیوه ی مورد بحث من این select ها توسط مدیر صورت میگیره و داخل فایهای XML میگیره که فکر کنم (البته مطمئن نیستم!)شاید سرعت رو بیشتر بکنه.البته در صفحات بعدی (که جزئیات رو نشون میده)این ارتباط مستقیم با منبع اصلی خواهد بود که Relationalنگه داری میشن و نه با XML.
سوال کلی اینه که آیا ارتباط با یک فایل کم حجم XML و لود اطلاعات آن سریعتر خواهد بود یا ارتباط مستقیم با جداول SQL.
متشکر

mehdi.mousavi
سه شنبه 28 دی 1389, 11:04 صبح
با تشکر از پاسخ شما. یکی از دغدغه های من لود صفحه نخست سایت در کمترن زمان ممکن هستش.من فکر کردم که اگه صفحه نخست که دارای عناوینی مشخص هست ،همین عناوین مشخص توسط مدیر به هنگام به روز شدن عناوین اصلی به روز میشه و این فایل دارای حجم بسیار پایینی است که حداکثر شامل 100 رکورد است و این فایل XMLاز نو نوشته میشه.و پرسش اینجاست که با چنین شرایطی ‌‌ آیا بهینه است که منبع جداول موقت سایت این فایل XML باشد یا خیر.آیا تاثیریقابل مشاهده در سرعت لود اطلاعات خواهد داشت یا نه؟چون اگر بخواهیم این اطلاعات را از جداول SQL دریافت کنیم باید طی دستورات و select کردن آنها مورد بازیابی قرار بگیرند حال آنکه در شیوه ی مورد بحث من این select ها توسط مدیر صورت میگیره و داخل فایهای XML میگیره که فکر کنم (البته مطمئن نیستم!)شاید سرعت رو بیشتر بکنه.البته در صفحات بعدی (که جزئیات رو نشون میده)این ارتباط مستقیم با منبع اصلی خواهد بود که Relationalنگه داری میشن و نه با XML. سوال کلی اینه که آیا ارتباط با یک فایل کم حجم XML و لود اطلاعات آن سریعتر خواهد بود یا ارتباط مستقیم با جداول SQL. متشکر

سلام.
اجازه بدید من سوال شما رو به گونه ای متفاوت (و به ظاهر بی ربط)، پاسخ بدم. در دنیای واقعی، Data Store های متفاوتی می تونیم داشته باشیم که هر یک برای منظور و مقصود خاصی مورد استفاده قرار میگیره:


master data store: بانک اصلی ای هستش که داده ها در اون ذخیره میشن و عملکرد روزانه یک سازمان روی اون استواره. برقراری توازن بین ذخیره و بازیابی اطلاعات در این بانک از اهمیت ویژه ای برخورداره و باید قوانین NF در اون رعایت بشه.
caching data store: با Partitioning بخشی از داده های بانک master و ارائه اونها بصورت فقط خواندنی، بار از روی master db برداشته میشه و به همین ترتیب، سرعت load این داده ها بیشتر میشه. caching data store ممکنه توسط MSMQ، Web Services، مکانیزمهای caching در ASP.NET (یا دیگر زبانها/ابزارهای تولید کد HTML در سمت سرور) و ... صورت بگیره. اولویت اول در caching data store ها، tune کردن اونها برای load "سریع" داده ها هستش.
reference data store: داده های عمومی فقط خواندنی ای هستن که بسیار به ندرت تغییر میکنن، مثل Alpha3 Code کشورها، پیش شماره های هر کشور و ... اولویت اول در این نوع data store ها، tune کردن اونها برای load "بسیار سریع" داده ها هستش.
data warehouse: جمع کردن داده ها از master data store های متفاوت و ارائه اونها بصورت uniform رو data warehouse میگن (که این مورد به بحث ما ارتباطی پیدا نمیکنه).
data mart: همون data warehouse هستش، اما برای پاسخگویی به نیازهای یه حوزه داده ای مورد استفاده قرار میگیره (اینم به بحث ما ارتباطی نداره).

خوب. حالا اینها رو گفتم که بگم، شما ابتدا باید جایگاه قرارگیری اطلاعات مورد نظرتون رو بر اساس تعاریف فوق مشخص کنید. به نظر میرسه، صفحه ابتدایی شما در caching data store قرار میگیره. در ASP.NET (که من نمیدونم شما بر پایه اون سایت خودتون رو طراحی می کنید یا خیر) ما دو نوع کلی از Cache کردن اطلاعات داریم: Output Caching و Data Caching. به همین ترتیب، دو گونه caching بر اساس این مدل ها پیاده سازی شده: Fragment Caching و Data Store Caching. هر کدوم از اینها، اگر در جایگاه خودش و بخوبی ازشون بهره برده بشه، سرعت Load صفحه رو بطرز شگفت انگیزی میتونه افزایش بده، بدون اینکه نیاز باشه خودتون رو درگیر ساخت فایلهای XML و ... کنید و می تونید بر اساس OLTP (یا همون master data store) خودتون، داده ها رو فقط برای بار اول از بانک بخونید. Hit های بعدی همون URL (با پارامترهای یکسان یا متفاوت، بر اساس نیاز) میتونه از Cache سرو بشه، بدون اینکه ASP.NET Page Life-cycle انجام بشه. به بیان دیگه، شما میتونید کپی ای از HTML ای که قبلا برای Hit قبلی سرو شده بود رو مجددا به Client ارسال کنید بدون اینکه درگیر جزییات کار بشید... علاوه بر این، Cache رو میتونید به گونه ای برنامه ریزی کنید که در صورت کمبود حافظه در سرور، خودش بطور خودکار از بین بره تا حافظه بیشتری برای پاسخگویی به کاربران در دسترس ASP.NET Runtime باشه.

نتیجه: قبل از عملی کردن این ایده (خوندن اطلاعات از فایل XML)، امکانات Caching اون Framework ای رو که بر اساس اون میخواهید کدتون رو بنویسید رو خوب بشناسید. آشنایی و استفاده از این امکانات، شما رو از شر تولید، به روز رسانی و مدیریت فایلهای XML خلاص میکنه و در عین حال، سرعت مورد نظرتون برای Load صفحه اول (یا دیگر صفحات) رو نیز به ارمغان میاره.

موفق باشید.

yosefi_hossein
چهارشنبه 18 اسفند 1389, 12:58 عصر
سلام خسته نباشید
یکسری اطلاعات دارم که ازچندتا جدول استخراج میشه و سمت Asp.Net یکسری عملیاتی انجام میدم که به طورچشم گیری باعث افزایش مرتبه زمانی اجرا میشه. حالا میخوام 1 مرتبه بخونم ،عملیات رو انجام بدم وتو 1 فایل XML دخیره کنم وازدفعات دوم به بعد داده ها روازاین فایل بخونم
حالا به نظرشما سرعت کار اینجوری بیشتر میشه یا نه؟ مرتبه زمانی کاهش پیدا میکنه یا نه؟

mehdi.mousavi
چهارشنبه 18 اسفند 1389, 15:16 عصر
سلام خسته نباشید یکسری اطلاعات دارم که ازچندتا جدول استخراج میشه و سمت Asp.Net یکسری عملیاتی انجام میدم که به طورچشم گیری باعث افزایش مرتبه زمانی اجرا میشه. حالا میخوام 1 مرتبه بخونم ،عملیات رو انجام بدم وتو 1 فایل XML دخیره کنم وازدفعات دوم به بعد داده ها روازاین فایل بخونم حالا به نظرشما سرعت کار اینجوری بیشتر میشه یا نه؟ مرتبه زمانی کاهش پیدا میکنه یا نه؟

سلام.
من نمیتونم همینطوری بهتون پاسخ "بله"، "خیر" بدم. ما تو دنیای واقعی، با داده های واقعی روبرو هستیم.
روی کاغذ و در صحبت، بله. به نظر میرسه انجام اینکار باعث افزایش سرعت در Hit های دوم به بعد خواهد شد.
اما ممکنه در عمل، این اتفاق نیفته! ممکنه فایل XML شما اینقدر بزرگ بشه که Parse کردن اون توسط XML Parser
(یا عمل Serialize/Deserialize کردن Object مربوطه بسته به نوع پیاده سازی)، به مراتب بیش از پردازش داده های
خام زمان ببره... اما قاعدتا، در شرایط طبیعی، شما دارید نتایج یک پروسه رو ذخیره می کنید و بعدا با رجوع به اون
نتایج، صفحه رو Load می کنید. طبیعتا اگر پردازش اون "یکسری عملیات" شما، "مدت زمان زیادی" رو به خودش اختصاص
میده، ذخیره / بارگذاری اون نتایج میتونه Performance رو در حد قابل قبولی افزایش بده.

موفق باشید.