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 اجرا میشوند .
قسمتی از برنامه من مربوط به ادغام 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 اجرا میشوند .