Run schedule แล้ว mssql ตาย ค่ะ คือปัญหามันเกิดจากโปรแกรมตัวเนี้ยต้องรันอัพเดตข้อมูลทุกวัน
ใช้แบบ connection.open() อยู่ละสิ
เปลี่ยนมาใช้แบบ connectionless (data adapter) ดีกว่า sql server จะได้ไม่ต้องทำงานหนัก
แต่จะไปหนัก memory ของ web server แทน (ถ้า RAM เยอะก็ไม่เป็นไร)
Date :
2010-06-25 18:35:29
By :
tungman
เพื่อลดภาระของ server ไม่ว่าจะทำด้วยวิธีใด
จากที่เคย handle ข้อมูลปริมาณเยอะๆนะคะ
1. ค่อยๆตัด query ออกมาทำทีละส่วน แล้วค่อยดำเนินการเช่น
update ทีละ 500 ทำหลายๆครั้งเอา ซึ่งก็ใส่ loop เข้าไป
2. เพื่อการเข้าถึงรวดเร็ว index ขาดไม่ได้เลยค่ะ
Date :
2010-06-25 20:04:15
By :
blurEyes
คือใช้ Procedure ในการ Insert ข้อมูลค่ะ แล้วให้ .Net เรียก Procedure ขึ้นมาทำงานอีกทีนึง
คือที่สังเกตุมาเรื่อยๆ MSSQL มันไม่คืน RAM ค่ะ พอสั่ง stop mssqlserver ผ่าน cmd ค่า ram ที่ใช้อยู่ก็ลดนะค่ะ
แล้วอย่างนี้จะต้องใช้วิธีไหนที่เมื่อมันทำงานเรียบร้อยแล้วให้คือ memory ออกมกให้หมด
รบกวนหน่อยค่ะ
Date :
2010-08-02 11:10:54
By :
somooo
ลองให้ method dispose() ดู
ให้ dispose มันทุกๆ object ที่เกี่ยวข้องเลย
Date :
2010-08-02 12:04:00
By :
tungman
ขอบคุณคุณ tungman คะ แต่ว่าเกิดปัญหานิดหน่อยค่ะ คือ
dispose() เนี่ยยังไม่เคยใช้เลยค่ะ แต่จากที่หาๆดูแล้ว หลักการคือ
สมมุตเรามี sub () อยู่ 3 sub เราก็ต้อง dispose() 3 ครั้ง ตรงบันทัดสุดท้ายของแต่ละ sub (กรณีที่ไม่ได้ดัก error นะค่ะ)
ถ้าใช่ มันมีปัญหาค่ะ มัน error The ConnectionString property has not been initialized
ปล.คือในส่วนของ sub พวกนี้มันจะทำงานต่อกันนะค่ะ พอเอา dispose() อันแรกออกมันก็ใช้งานต่อได้ค่ะ แต่ว่ามันจะคืนเมมไม่หมดค่ะ
หรือถ้าไม่ใช่ ตรงทำอย่างไรคะ รบกวนหน่อยค่ะ
Date :
2010-08-02 14:39:11
By :
somooo
ทำตามที่คุณ tungman บอกแล้วค่ะ ไปสร้างซับย่อยให้มัน dispose ก็ทำงานได้ตามปกติค่ะ แต่ว่ามันไม่คืน memory นี่สิค่ะ
คือเข้าใจว่า mssql server เนี่ยมันจะดึง ram เข้ามาเยอะๆเพื่อให้มันรันได้ไวขึ้น พอตอนรันมันดึงขึ้นไป 1 GB พองานเสร็จเรียบร้อย กลับไม่คืน memory ให้เลย นี่ไปเซ็ทตรง ค่า max memory ตรง properties ของ server เป็น 512 ไว้แล้วนะค่ะ ไม่รู้เลยว่าต้องทำอย่างไร ตอนนี้ทำได้แค่ restart msssqlserver แต่มันไม่ใช่วิธีแก้ปัญหาอะค่ะ
ต้องทำอย่างไรดีคะ
Date :
2010-08-02 16:17:51
By :
somooo
และอีกอย่างนึงที่สังเกตุเห็นนะค่ะ คือขอบอกก่อนว่าการทำงานของการ Insert ข้อมูลคือ
1. ใช้ View ดึงข้อมูลมาจาก DB ตัวที่ 2
2. ใช้ Store procedure insert data เข้า DB 1 โดยการ select จาก view
3. ใช้ .net เรียก SP ทำงาน
คือที่ลองดูแค่เข้าไปเปิด Views ที่เขียนดึงข้อมูลมาจาก DB อีกตัวนึง มันก็กิน memory เยอะมากๆ เลยค่ะ (เอ๊ะ! หรือปัญหาจะเกิดจาก Views คะ) กิน mem เยอะไม่ว่า แต่ไม่ยอมคืนนี่ไม่ไหวนะค่ะ
ใครทราบรบกวนหน่อยนะค่ะ
Date :
2010-08-02 16:39:54
By :
somooo
แสดงว่าปัญหามันไปติดที่ sql sever เหรอครับ
คัมภีย์ sql ก็ไม่เห็นมาตอบตั้งหลายวันแล้วด้วย สงสัยสอบอยู่
Date :
2010-08-02 17:39:47
By :
tungman
คิดว่าก็น่าจะเป็นอย่างนั้นนะค่ะ เพราะจากที่ลองหาๆดู เขาบอกว่า sql 2000 มันไม่คืน memory
ถ้าเป็นอย่างนั้นจริง ตายแน่เลยค่ะ เพราะมันอยู่บนเครื่อง server ด้วย ไม่คืนบ่อยๆเข้าสะสม เครื่องเจ๊งอีก ....
ถ้ามีใครพอทราบขอคำชี้แนะหน่อยนะค่ะ
Date :
2010-08-02 17:52:25
By :
somooo
ตอนนี้เริ่มมีแนวคิดว่าจะเปลี่ยนจาก MSSQL 2000 เป็น MSSQL 2005 คิดว่าจะแก้ปัญหาได้บ้างมั้ยคะ
ซึ่งใครเคยทำแบบนี้บ้าง มันต้องระวังเรื่องอะไรบ้าง ต้องแก้ส่วนไหน ยังไง ขอความคิดเห็นหน่อยนะค่ะ
Date :
2010-08-03 09:31:36
By :
somooo
น่าจะยังเป็นปัญหาอยู่ค่ะ
จิงๆที่คุนส้มโอเจอ ถือเป็นเรื่องปกติของ mssql นะคะ
เพราะตัว mssql จะถือว่า memory เป็น primary cache โดยจะพยายามดึงเอา memory มาใช้ให้มากที่สุด
ซึ่งเราก้อตั้งได้ว่าจะ ให้ mssql ใช้ memory ไปเท่าไหร่ ทีนี้ปัญหามักจะเกิดเมื่อมีกระบวนการกับ record จำนวนมากๆ
หลังจากการใช้งานแล้ว mssql จะยังยึด memory เอาไว้ ซึ่ง mssql จะคืน memory ให้เมื่อ os มีการร้องขอ
แต่มักจะพบว่ามันนานมาก เป็น ชม. หรือวันกว่าจะคืนให้ << อันนี้อ่านจาก trouble shooting ของ mssql นานมากละค่ะ
ทางออกมีหลายทางเริ่มตั้งแต่ ติดโปรแกรมตระกูล memory recovery เพื่อ force ให้คืน mem แต่มีข้อเสียคือ
ต้องหา version ที่ทำงนกับ server ซึงก็แพงอยู่ค่ะ
หรือที่แนะนำไปแล้วพยายามตัด operation ของเป็น ส่วนย่อยๆ ทำน้อยๆประมาณ 1000 - 5000 record แล้ววนลูปไปเรื่อยๆ
เพื่อไม่ให้ mssql ใช้ memory มากเกินไป ทั้งนี้เป็น tecnic ที่สังเกตุจากโปรแกรม convert database
ตังนึงที่ convert record จำนวนมากๆทั้งๆที่โปนแกรมอื่น knock ไปแล้วอะค่ะ
ไม่รุจะช่วยได้มากน้อยยังไงนะคะแต่ทุกวันก้อใช้วิธีนี้อยู่ค่ะ
Date :
2010-08-04 20:11:48
By :
blurEyes
อัพเซอร์ฟเวอร์ดีกว่ามั้ง
ไม่ก็ redesign db/query
Date :
2010-08-04 20:27:08
By :
pjgunner
ตอนนี้ไป dispose แล้วก็ nothing แล้วก็ใช้ using ด้วย ใช้ให้หมดเลยค่ะ 555 และก็ไปเซ็ทค่า max ให้มันไม่ต้องเยอะมากสักสามร้อย ก็พอทนค่ะ
ขอบคุณทุกๆคำตอบเลยนะค่ะ
Date :
2010-08-05 21:27:59
By :
somooo
Load balance : Server 01