PDA

View Full Version : ذخیره عکس و کند شدن شدید کوئری



iran400
چهارشنبه 25 مهر 1386, 21:56 عصر
با سلام
برای اولین بار تصمیم گرفتم عکس را توی دیتابیس عکس ذخیره می‌کنم
هفت تا رکورد ذخیره کردم که دو تا رکوردش نال و سه تا رکورد عکس 6 کیلوبایتی و دو تا رکورد 4 مگی
وقتی که کوئری روش می‌زنم 2 تا 3 ثانیه طول می‌کشه! برای داده های بیشتر که دیگه خدا می‌دونه چقدر زمان می‌بره.

بنده فیلد عکس رو از نوع varbinary(MAX) تعریف کردم.


آیا اشتباه از طرف بنده بوده؟ کجای کار رو اشتباه کردم؟

sarvestan
چهارشنبه 25 مهر 1386, 22:34 عصر
بلی، میشود گفت اشتباه نموده اید!

FIELD خود را از نوع IMAGE تعریف نمایید! کارتان بس راحتتر میگردد! هرچند باید دلیل محکمی برای ذخیره سازی فایل ها در دیتابیس داشته باشید!
شاد باشید

hamed_bostan
پنج شنبه 26 مهر 1386, 00:17 صبح
دوستمون درست میگن . برای ذخیره از فیلد image استفاده کنید که نوعش هم باینری هست اما راه اصولی ذخیره ادرس عکس در بانک و ذخیره خود عکس روی دیسک سخته .

vcldeveloper
پنج شنبه 26 مهر 1386, 01:54 صبح
اما راه اصولی ذخیره ادرس عکس در بانک و ذخیره خود عکس روی دیسک سخته .
همچین اصلی وجود نداره. قبلا هم بارها گفته شد که ذخیره عکس در بانک، یا ذخیره آن بر روی دیسک هر یک مزایا و معایب خاص خودشان را دارند. پس این نوع پروژه و نیازمندی های آن است که مشخص می کند آیا عکس ها در بانک ذخیره شوند، یا بر روی دیسک.


بنده فیلد عکس رو از نوع varbinary(MAX) تعریف کردم.

خود را از نوع IMAGE تعریف نمایید!
همانطوری که دوستان گفتند، از Image استفاده کنید. Type های Image و nText بصورت باینری نگه داری میشند. Sql Server بصورت پیش فرض داده های این نوع از فیلدها را جدا از داده های سایر فیلدها نگه داری می کند که این امر باعث می شود کوئری هایی که نیازی به داده های این نوع فیلد ندارند، سریعتر اجرا شوند.

eyes_shut_number1
پنج شنبه 26 مهر 1386, 06:45 صبح
اصولا n تا عکس سنگینم میتونه با استراتجی Partitioning راحت کوری بده!
پس اصلی وجود نداره کا عکس در بانک نباید باشه!

AminSobati
پنج شنبه 26 مهر 1386, 12:22 عصر
در SQL Server 2005 تایپهای ntext, text, image بازنشسته شده اند و مایکروسافت توصیه میکنه از varchar max, nvarchar max , varbinary max استفاده کنید. حتی گفته شاید در نسخه های بعدی، اصلا ntext , image و ... وجود نداشته باشند.
اما در خصوص کند شدن Query تنها نباید به تعداد رکوردها توجه کنین، بلکه سایز رکوردها بسیار حائز اهمیته. شما اگرچه 4 یا 5 رکورد دارید، اما حداقل 8 مگابایت هست.
با استفاده از Filegroupها و تفکیک فیلدهای LOB از سایر فیلدها میتونین به سرعت بازیابی اطلاعات در Queryهایی که تصاویر رو نیاز ندارند کمک کنید

iran400
جمعه 27 مهر 1386, 11:00 صبح
سلام

تشکر می‌کنم از همه شما که بنده را راهنمایی فرمودید.

بنده در این تیبل فقط می‌خواستم عکس فردی که لاگین می‌کند را در داخل دیتابیس ذخیره کنم ولی در ادامه کار می‌خواهم فایلهای پیوست مثل عکس، ورد، pdf و ... را ذخیره کنم.
بنده قبلا همیشه تو پروژه های تحت وب عکس و فایلها را از دیتابیس جدا نگه می‌داشتم و هیچ مشکلی هم نداشتم.
حالا توی یک پروژه ویندوز بیس کلاینت سروری با سی شارپ به مشکل برخورد کرده ام.

بفرمایید اگر حجم و تعداد فایلهای پیوستی توی دیتابیس زیاد باشد بنده باید طراحی رو تغییر بدم که فایلها بیرون دیتابیس باشند یا داخل دیتابیس و از چه نوعی باشند.

راستی ممنون می‌شوم توضیحی در مورد (Filegroupها و تفکیک فیلدهای LOB) بدهید

با تشکر

SYNDROME
جمعه 27 مهر 1386, 16:24 عصر
بفرمایید اگر حجم و تعداد فایلهای پیوستی توی دیتابیس زیاد باشد بنده باید طراحی رو تغییر بدم که فایلها بیرون دیتابیس باشند یا داخل دیتابیس و از چه نوعی باشند.

دوست عزیز هر چقدر حجم بانک بالا برود عملیات شما هم کند خواهد شد.
من هم در برنامه عکس ها در داخل بانک دخیره می کنم ولی اجازه نمی دهد کاربر عکس بالای 30Kb ذخیره کند.
بخاطر این که اگر بگذارم حجم عکسها بالا برود به مشکل شمل بر می خورم ولی به این دقت کنید عکس هایی که بنده ذخیره می کنم یک عکس 3 * 4 است.
حالا شما باید به این نکته دقت کنید که در بدترین حالت چقدر می تواند حجم بانک شما بالا برود.
موفق باشید

AminSobati
جمعه 27 مهر 1386, 21:02 عصر
اگر ساختار بانک اطلاعاتی شما مناسب باشه، هیچ دلیلی برای کندی در حجم بالای اطلاعات حتی با ذخیره تصاویر وجود نداره. فرضا یک دیتابیس نرم افزار دبیرخانه که Tuning اون رو انجام دادم، حاوی عکسهای اسکن شده از نامه ها هستش. در حال حاضر این دیتابیس به 40 گیگابایت رسیده و همچنان بدون مشکل در حال استفاده هست. البته تصور نکنید که تکنیک خارق العاده ای در طراحی این دیتابیس بکار رفته! خیر، تنها Queryها و Indexها ایده آل هستند و از امکانات Filegroup به خوبی استفاده شده.

iran400
جمعه 27 مهر 1386, 23:12 عصر
سلام
بنده یک تیبل با نام یوزر ساختم که در آن فیلدی با نام پیک از نوع ایمیج می‌باشد.
الان فقط یک رکورد اضافه کردم اون هم با عکسی معادل 4 کیلوبایت

حالا کوئری می‌زنم فقط بر روی یک رکورد، یک ثانیه طول می‌کشه!!!



با تشکر

eyes_shut_number1
شنبه 28 مهر 1386, 06:58 صبح
استاد فرمودن به جای image , text از varchar max, nvarchar max , varbinary max
استفاده کنید
شاید حل شد
ولی اصولا نباید با 4 کی این مشکلات پیش بیاد

mhadvi_mahmaood
شنبه 28 مهر 1386, 12:53 عصر
همانطور که گفته شده از file groupها استفاده کنید

eyes_shut_number1
شنبه 28 مهر 1386, 12:56 عصر
فکر نکنم برای یک رکورد لازم باشه partitioning کرد!
با این حساب هر رکورد میره توی یه فایل گروپ که بعید میدونم آقلانه باشه

whitehat
شنبه 28 مهر 1386, 15:56 عصر
با این حساب هر رکورد میره توی یه فایل گروپ که بعید میدونم آقلانه باشه
رکورد در File Group قرار نمی گیره، منظور فیلد LOB هست که باید در یک File Group مجزا قرار داشته باشه.

iran400
سه شنبه 01 آبان 1386, 14:25 عصر
سلام
تشکر می‌کنم از دوستان که همراهی فرمودند

از آنجا که بعضی پروژه‌ها ذاتا کار با عکس و فایل دارند که مثل دبیرخانه بهتر نیست که عکس‌ها را بصورت فایل داخل فولدر برنامه ذخیره کنیم و فقط اسم فایل را توی دیتابیس ذخیره کنیم؟



با تشکر