PDA

View Full Version : سوال: مدیریت حافظه در ادغام دوجدول



Sub Zero
جمعه 03 خرداد 1387, 11:42 صبح
با سلام.
قسمتی از برنامه من مربوط به ادغام 2 جدول از دو دیتا بیس مختلف است (این ادغام براساس اختلاف دو جدول انجام می شود) در ابتدا از برنامه TableDiff که از ابزارهای خود Sql است (مسیر : C:\Program Files\Microsoft SQL Server\90\COM )
استفاده کردم اما متوجه شدم که این برنامه اختلافات رو براساس کل رکورد بر میگردونه در صورتی که من نیاز داشتم اختلافات دوجدول تنها براساس 3 فیلد مشخص بشند برای همین از کوئری زیر استفاده کردم .

Select Lmarker,Mesc,Unit From [DataBase1].[dbo].[MESC]
Where (Lmarker In ('H','S') And substring(mesc,1,2) In ('40','41') )
Except
Select Lmarker,Mesc,Unit From [DataBase2].[dbo].[MESC]
Where (Lmarker In ('H','S'))
Order By Mesc Asc


بعد نتایج حاصل رو در یک جدول موقت ذخیره کردم و در ادامه به ازاء هر رکورد کوئری زیر رو اجرا کردم :

Insert Into [DataBase2].[dbo].[MESC]
Select * From TmpTable Where (Lmarker=' ' And Mesc=' ' And Unit=' ')


سوال اول من اینه ، آیا روش بهینه تری برای انجام این کار وجود داره باتوجه به اینکه تعداد رکوردها بالای 20000 است.

مورد دوم :
برای تست و بررسی زمان انجام این کوئری ، قبل و بعد از ایندکس گذاری بر روی جداول مورد نظر ، بارها اونو اجرا کردم اما متوجه شدم هر بار که کوئری اجرا میشه مقدار حافظه ای که پروسس SqlServer از سیستم میگیره بیشتر میشه ، البته با توجه به کوئری هایی که میگیرم طبیعی هم هست . در پایان مجبورم برای بازپس گیری حافظه, SqlExpress رو Restart کنم

سوال دوم من اینه ، مسلما روشهایی برای مدیریت بهینه حافظه در SQl وجود داره که بنده از اونها بی اطلاعم .

اگه ممکنه روشی رو برای باز پس گیری حافظه گرفته شده پس از اتمام کار ارائه بدید .

توضیح :
تمامی کوئری ها در محیط VB.Net اجرا میشوند .

Sub Zero
شنبه 04 خرداد 1387, 15:15 عصر
در مورد برگرداندن حافظه به سیستم دستور DBCC DROPCLEANBUFFERS
رو پیدا کردم اما جواب نداد ! اساتید Sql جهت برگرداندن حافظه اشغال شده راه حل مناسبی سراغ ندارند؟

AminSobati
شنبه 04 خرداد 1387, 18:43 عصر
SQL Server تمایل داره تا حد امکان اطلاعات شما رو Cache کنه تا دسترسی به دیسک کمتر بشه. حافظه ای که میبینید رشد کرده، بعد از اون دستور dbcc خالی میشه اما به دست ویندوز برنمیگرده. SQL Server این فضا رو نگه میداره برای Loadهای بعدی. زمانی که ویندوز با کمبود حافظه مواجه بشه، به SQL Server اطلاع میده. SQL Server یک مامور به اسم Lazy Writer رو وارد عمل میکنه تا Pageهایی که کمتر مورد استفاده قرار گرفتند رو از حافظه به دیسک برگردونه، که نتیجتا بخشی از حافظه مجددا در اختیار ویندوز قرار میگیره. این از ساده ترین اموری هست که Dynamic Memory Management بهش اطلاق میشه. اساسا به همین دلیل توصیه میشه روی SQL Server برنامه مهم دیگه ای مثل Exchange Server, Active Directory یا ... نصب نکنید تا SQL Server تنها برنامه مهم روی اون سرور باشه