PDA

View Full Version : بهینه کردن یک query



mehrpars
جمعه 07 خرداد 1389, 17:09 عصر
سلام ،
بالای 20،000 رکورد روی بانک اطلاعاتی سمت سرور دارم که روی وب هم هست.
این رکورد ها باید با رکورد های سمت کلاینت (local) چک شن
در صورت نیاز باید تغییرات لازم روی کلاینت اعمال شه ،
این تغییرات میتونن شامل Insert , Delete , Update باشن

سئوال اینکه ; به نظر شما کل رکوردهارو سمت کلاینت پاک کنم و دوباره Insert کنم ؟
و یا اینکه با query های تودرتو اینکارو انجام بدم ؟

یا ، آیا این امکان هست که بتونم همه رکوردهارو روی sqlserver کلاینت Cache کنم و عملیات هارو انجام بدم ، تا بار سرور سبکتر شه و سرعت نرم افزارم بالاتر بره ؟؟؟

و یا راهی دیگه (سرعت بیشتر ، امنیت بیشتر) ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

pezhvakco
جمعه 07 خرداد 1389, 18:42 عصر
درود :

این رکورد ها باید با رکورد های سمت کلاینت (local) چک شن
شما میخوای یک باره تمام دو جدول رو مقایسه کنی ؟
نمیشه با ایجاد یک تغییر (اضافه، حذف یا ویرایش) برای هر ردیف جدول، این کار رو انجام بدی .


سئوال اینکه ; به نظر شما کل رکوردهارو سمت کلاینت پاک کنم و دوباره Insert کنم ؟
این کار خیلی سنگینه و درست نیست .


و یا اینکه با query های تودرتو اینکارو انجام بدم ؟
بستگی داره این کوئری ها چی باشه .

اگه یه کم بیش تر کار رو توضیح بدی، بهتره .

فکر خوش .

mehrpars
جمعه 07 خرداد 1389, 19:50 عصر
ممنون
ببینید ، من 3 تا جدول سرور رو باید Join کنم و فیلدای مورد نظر رو توی جداول لوکال تغییر بدم یا ثبت کنم و حجم رکورد بالایی هم دارم که رشد داره .
چه بخوام و چه نخوام Insert , delete , update رو دارم
چون میخوام دیتابیس لوکال رو بروز نگه دارم ،
خوب طبیعتا روی سرور یکسری رکوردها تغییر می کنن ، یکسری اضافه میشن و یکسری از رکوردا حذف میشن ... پس این تغییرات باید اعمال شن ، :اشتباه:

pezhvakco
جمعه 07 خرداد 1389, 20:16 عصر
منظورم این بود : مگه نمیتونی فقط اون ردیف جدول ها رو که لازمه در کلاینت ها تغییر کنه از جدول طرف سرور بدست بیاری و تغییر بدی و نه کل جدول سمت کلاینت ها .

فکر خوش .

mehrpars
جمعه 07 خرداد 1389, 20:30 عصر
ببینید ، هر ردیف یک فیلد داره که آخرین تاریخ ویرایش رو نشون میده ، پس من آخرین تاریخ ویرایش رو دارم
حالا باید اینو با رکوردای لوکال چک کنم و بر اساس کد واحد هر ردیف ، به این معنی که مثلا کد 203 روی لوکال تاریخ ویرایشش ، دیروز بوده و روی سرور ، امروز هست ... پس باید تغییر کنه ...
و به همین منوال رکوردای دیگه ،
خوب این یک سمت قضیه هست
بعد باید ببینم اگر رکورد مثلا 400 روی سرور نیست ، از دیتابیس لوکال پاک شه و .... رکوردای دیگه ...
در نهایت رکوردایی که برروی سرور هست ولی روی لوکال نیست ، مثلا رکورد با آی دی 1000 روی سرور هست و روی لوکال نیست ، در نتیجه باید اضافه بشه

من واقعا گیج شدم که چه کاری رو انجام بدم

ASKaffash
شنبه 08 خرداد 1389, 09:36 صبح
سلام
نمی شود Replication استفاده کرد ؟

armiin
شنبه 08 خرداد 1389, 10:10 صبح
به نظرم بد نیست تغییرات در یک جدول ذخیره کنید ، مثلا یه فیلد برای اسم جدولی که داخلش اون تغییر اتفاق افتاده ، یه فیلد برای ID (منظور فیلد Primary Key ) اون رکورد ، یه فیلد هم برای نوع تغییر (Update , Delete , Insert ) ،در صورت نیاز یه فیلد هم برای تاریخ !
در نهایت با هر بار بروز رسانی دیتابیس Local ،این جدول را در دیتابیس سرور Truncate کنید که فضای دیتابیس سرورتون بیجا اشغال نشه

mehrpars
شنبه 08 خرداد 1389, 11:29 صبح
سلام
نمی شود Replication استفاده کرد ؟

فکر نمیکنم با replication بشه ، البته من خیلی در مورد replication نمی دونم:متفکر:

ASKaffash
شنبه 08 خرداد 1389, 11:38 صبح
فکر نمیکنم با replication بشه ، البته من خیلی در مورد replication نمی دونم:متفکر:
سلام
اینو ببین :

mehrpars
شنبه 08 خرداد 1389, 11:38 صبح
این نکته رو بگم ، دیتا بیس های من همیشه به هم وصل نیستن
یعنی اینکه برنامه offline هست ، با انتخاب کاربر به وب متصل می شه ، update میکنه لوکال رو و بعد disConnect میکنه
و نکته بعد اینکه سرور read-only هست یعنی کاربر سمت نرم افزار جز select هیچ کار دیگه روی سرور نمی کنه

به نظرتون می شه ، ویا این امکان هست که یکبار select رو روی سرور انجام بدم ، اطلاعات رو کش کنم و ارتباط رو قطع کنم؟ و عملیاتهای insert , delete , update رو روی اطلاعات کش شده انجام بدم

ASKaffash
شنبه 08 خرداد 1389, 11:52 صبح
سلام
تضادی با Replication ندارد (یکطرفه)

mehrpars
شنبه 08 خرداد 1389, 12:57 عصر
سلام
اینو ببین :

ممنون ، خیلی مفید بود
ولی من ارتباط دائم بین کلاینت و سرورم ندارم ، در ضمن کاربرامو هم نمی شناسم
کاربر کلاینت ، هر کسی با هر آی پی در هر جا می تونه باشه و فقط برای update به سرور وصل می شه