PDA

View Full Version : سوال: افزایش سرعت بارگزاری اطلاعات هنگامی که رکوردها دارای تصویر هستند



mahan206
شنبه 14 دی 1398, 17:57 عصر
سلام برنامه ای نوشتم به این صورت که رکوردها در دیتابس به صورت زیر هستند
CREATE TABLE [dbo].[tbl1] (
[heyid] INT IDENTITY (1, 1) NOT NULL,
[heynamber] INT NOT NULL,
[heynamberD] NVARCHAR (50) NOT NULL,
[heydate] DATETIME NOT NULL,
[heymelli] NVARCHAR (10) NOT NULL,
[heytype] NVARCHAR (200) NOT NULL,
[heyimg] VARBINARY (MAX) NOT NULL,
[heyok] BIT DEFAULT ((0)) NOT NULL,
[heyoffice] NVARCHAR (50) NOT NULL,
[heyprice] NVARCHAR (50) NOT NULL,
[heyejra] DATETIME DEFAULT (NULL) NULL,
PRIMARY KEY CLUSTERED ([heyid] ASC)
);



وقتی جستجو میزنم به صورت پروسیجر داده ها با عکس سرعتشون کم بود ولی اومدم و دستور را بدون عکس زدم و سرعتش با 500 رکورد خوبه فقط وقتی به این صورت عکس رو جدا گونه از بانک میخونم سرعت یکم کند شده و میترسم کند تر هم بشه .پیشنهاد شما چیه؟
CREATE PROCEDURE [dbo].[Pshowimg]
@heyid int
AS
SELECT heyid, heyimg from tbl1 where heyid=@heyid
RETURN 0
کد c# خوندن عکس هم
SqlConnection connect2 = new SqlConnection(ConfigurationManager.ConnectionStrin gs["conect"].ToString());
connect2.Open();
SqlCommand cmd2 = new SqlCommand("Pshowimg", connect2);
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.Parameters.Add("@heyid", SqlDbType.NVarChar).Value =
this.dataGridView1.Rows[rowIndex].Cells["heyid"].Value;
SqlDataReader dread2 = cmd2.ExecuteReader();
if (dread2.Read())
{
Image img;
byte[] imageByte = (byte[])dread2["heyimg"];
MemoryStream ms = new MemoryStream(imageByte);
img = Image.FromStream(ms);
bmp = new Bitmap(img);
}

dread2.Close();
connect2.Close();

رامین مرادی
شنبه 14 دی 1398, 18:43 عصر
به نظرم ذخیره تصویر در دیتابیس یکی از بزرگترین اشتباهاته.اونم به صورتی که شما دارید ذخیره میکنید. یا برید سمت فایل تیبل یا اینکه عکسهارو در فولدری در کنار برنامه ذخیره کنید و هنگامی که کاربر روی ردیفی کلیک میکند متناظر با ان ردیف عکس از فولدر فراخوانی شود.

mahan206
شنبه 14 دی 1398, 21:55 عصر
به نظرم ذخیره تصویر در دیتابیس یکی از بزرگترین اشتباهاته.اونم به صورتی که شما دارید ذخیره میکنید. یا برید سمت فایل تیبل یا اینکه عکسهارو در فولدری در کنار برنامه ذخیره کنید و هنگامی که کاربر روی ردیفی کلیک میکند متناظر با ان ردیف عکس از فولدر فراخوانی شود.

اونوقت بک آپ گرفتن از اون مشکله چون سرور من یه سیستم سادست و هر آن ممکنه بسوزه
الان تو یه سیستم اتوماسیون اداری که داریم باهاش کار میکنیم عکس به صورت VARBINARY (MAX) در بانک ذخیره شده.

رامین مرادی
یک شنبه 15 دی 1398, 08:11 صبح
اونوقت بک آپ گرفتن از اون مشکله چون سرور من یه سیستم سادست و هر آن ممکنه بسوزه
الان تو یه سیستم اتوماسیون اداری که داریم باهاش کار میکنیم عکس به صورت VARBINARY (MAX) در بانک ذخیره شده.

عر طور تمایلید میتونید انجام بدید ولی مطمئن باشید نه تنها من بلکه اساتید من تو این فروم که خیلی چیزا ازشون یاد گرفتم هم شماره رو ترغیب میکنن تو دیتابیس ذخیره نکنید.
الان من یه دیتابیس دارم که 3 ساله کار میکنه . حجمش 200 مگ نشده و فایلهای کنارش تا مرز 300 گیگ رفته . فکر کنید یه دیتابیس 300 گیگی بکاپ و نگهداریش راحتتره یا 200 مگا بایتی؟ بکاپ رو میتونید با نرم افزار های جانبی مثل آکرونیک هم تنظیم کنید خودکار از فایلهاتون بگیره. دیتابیس رو هم اتوماتیک میتونید بکنید.

مطمئن باشید چندتا فایل از دست رفته رو میشه بازیابی یا جایگزین کرد اما دیتابیس چند صد گیگابایتی کارو خیلی سخت تر میکنه.


فارغ از اینهمه توصیه ای که کردم (:لبخند:). شما وقتی سلکت میکنید اون فیلد تصویر رو از سلکتتون حذف کنید. بعد که کاربر رو سطر کلیک کرد تصویر رو همون لحظه سلکت کنید.

mahan206
یک شنبه 15 دی 1398, 09:55 صبح
عر طور تمایلید میتونید انجام بدید ولی مطمئن باشید نه تنها من بلکه اساتید من تو این فروم که خیلی چیزا ازشون یاد گرفتم هم شماره رو ترغیب میکنن تو دیتابیس ذخیره نکنید.
الان من یه دیتابیس دارم که 3 ساله کار میکنه . حجمش 200 مگ نشده و فایلهای کنارش تا مرز 300 گیگ رفته . فکر کنید یه دیتابیس 300 گیگی بکاپ و نگهداریش راحتتره یا 200 مگا بایتی؟ بکاپ رو میتونید با نرم افزار های جانبی مثل آکرونیک هم تنظیم کنید خودکار از فایلهاتون بگیره. دیتابیس رو هم اتوماتیک میتونید بکنید.

مطمئن باشید چندتا فایل از دست رفته رو میشه بازیابی یا جایگزین کرد اما دیتابیس چند صد گیگابایتی کارو خیلی سخت تر میکنه.


فارغ از اینهمه توصیه ای که کردم (:لبخند:). شما وقتی سلکت میکنید اون فیلد تصویر رو از سلکتتون حذف کنید. بعد که کاربر رو سطر کلیک کرد تصویر رو همون لحظه سلکت کنید.


منم اول خواستم به روشی که شما رفتید انجام بدم چون در طراحی سایت از این روش میرفتم اما بعد تو اینترنت که میخوندم دیگه پشیمون شدم و رفتم به این سمت .من کلا سلکت که میزنم بدون عکس سلکت میزنم و سرعتش خوبه و بعد که نمایش عکس کلیک میکنه یه جستجو در بانک میزنم دوباره وفقط عکس رو میارم که پروسیجرش هم گذاشته شده.فعلا سرعتش بد نیست من نگران اینده ام.
در کل حجم بانک با 500 رکورد الان شده 2 گیگ و برآورد میشه که هر سال حداقل 1000 رکورد یا 800 رکورد داشته باشیم.
این برنامه یه سیستم عادی 2 هسته ای به عنوان سرور گذاشتم و بعد به صورت شبکه سیستم های دیگه با این سرور ارتباط دارن.شبکه هم گستردست در حد یه استان.
خواستم فقط از تجربه دوستان و اساتید کمک بگیرم.

mahan206
یک شنبه 15 دی 1398, 10:57 صبح
این روش (https://www.dotnettips.info/post/331/%d8%a2%d8%b4%d9%86%d8%a7%db%8c%db%8c-%d8%a8%d8%a7-%d9%82%d8%a7%d8%a8%d9%84%db%8c%d8%aa-filestream-%d8%a7%d8%b3-%da%a9%db%8c%d9%88%d8%a7%d9%84-%d8%b3%d8%b1%d9%88%d8%b1-2008-%d9%82%d8%b3%d9%85%d8%aa-%d8%a7%d9%88%d9%84)چطوره؟ لطفا یه روش عالی بگید که من دوباره برنگردم از اول کد نویسی کنم ممنون

رامین مرادی
یک شنبه 15 دی 1398, 11:26 صبح
این روش (https://www.dotnettips.info/post/331/%d8%a2%d8%b4%d9%86%d8%a7%db%8c%db%8c-%d8%a8%d8%a7-%d9%82%d8%a7%d8%a8%d9%84%db%8c%d8%aa-filestream-%d8%a7%d8%b3-%da%a9%db%8c%d9%88%d8%a7%d9%84-%d8%b3%d8%b1%d9%88%d8%b1-2008-%d9%82%d8%b3%d9%85%d8%aa-%d8%a7%d9%88%d9%84)چطوره؟ لطفا یه روش عالی بگید که من دوباره برنگردم از اول کد نویسی کنم ممنون
تو اولین پست هم اشاره کردم. استفاده از فایل تیبل که روش جدیدتری نسبت به فایل استریم هست رو توصیه میکنم. البته فایل استریم هم روش خوبیه.

mahan206
یک شنبه 15 دی 1398, 12:03 عصر
تو اولین پست هم اشاره کردم. استفاده از فایل تیبل که روش جدیدتری نسبت به فایل استریم هست رو توصیه میکنم. البته فایل استریم هم روش خوبیه.

ممنونم منبع خوب سراغ نداری فارسی که به صورت ساده توضیح داده باشه

رامین مرادی
یک شنبه 15 دی 1398, 12:25 عصر
ممنونم منبع خوب سراغ نداری فارسی که به صورت ساده توضیح داده باشه
این برای فایل استریم
https://www.dotnettips.info/post/331/%d8%a2%d8%b4%d9%86%d8%a7%db%8c%db%8c-%d8%a8%d8%a7-%d9%82%d8%a7%d8%a8%d9%84%db%8c%d8%aa-filestream-%d8%a7%d8%b3-%da%a9%db%8c%d9%88%d8%a7%d9%84-%d8%b3%d8%b1%d9%88%d8%b1-2008-%d9%82%d8%b3%d9%85%d8%aa-%d8%a7%d9%88%d9%84

اینم برای فایل تیبل

https://www.dotnettips.info/post/1307/%d8%a2%d8%b4%d9%86%d8%a7%db%8c%db%8c-%d8%a8%d8%a7-filetable-%d8%af%d8%b1-sql-server-2012-%d8%a8%d8%ae%d8%b4-1

mahan206
یک شنبه 15 دی 1398, 12:40 عصر
اینا رو خودم پیدا کرده بودم ولی بازم ممنون راهنمایی کردی تشکر

mmbguide
سه شنبه 17 دی 1398, 22:19 عصر
سلام. پیشنهاد میکنم اگر نیاز هست که تصویر در بانک ذخیره بشه، در صورت امکان محدودیت حداکثر حجم براش تعریف کنید و یا در زمان ذخیره بصورت خودکار برنامه این کار رو انجام بده. اما راه حل دوم پیشنهادی من اینه که همیشه اگر مجبور هستید که عکس رو مستقیما در بانک ذخیره کنید حتما در زمان ذخیره یک Thumbnail از تصویر هم تولید و ذخیره کنید. تا در مواردی که یک تصویر رو میخوایید صرفا از لحاظ بررسی اجمالی بارگذاری کنید بهترین گزینه هستش و حالا هر زمان به تصویر اصلی نیاز داشتید میتونید همون تصویر رو کامل از بانک دریافت کنید. حتی میتونید یک جدول جداگانه برای تصاویر اصلی خودتون اضافه کنید.

البته در صورت امکان به سمت FileStream و FileTable برید.

mahan206
چهارشنبه 18 دی 1398, 07:26 صبح
سلام. پیشنهاد میکنم اگر نیاز هست که تصویر در بانک ذخیره بشه، در صورت امکان محدودیت حداکثر حجم براش تعریف کنید و یا در زمان ذخیره بصورت خودکار برنامه این کار رو انجام بده. اما راه حل دوم پیشنهادی من اینه که همیشه اگر مجبور هستید که عکس رو مستقیما در بانک ذخیره کنید حتما در زمان ذخیره یک Thumbnail از تصویر هم تولید و ذخیره کنید. تا در مواردی که یک تصویر رو میخوایید صرفا از لحاظ بررسی اجمالی بارگذاری کنید بهترین گزینه هستش و حالا هر زمان به تصویر اصلی نیاز داشتید میتونید همون تصویر رو کامل از بانک دریافت کنید. حتی میتونید یک جدول جداگانه برای تصاویر اصلی خودتون اضافه کنید.

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