Archive

Archive for May, 2010

What’s new SQL 2008 (ตอน Hot-Add CPUs and Hot-Add Memory)


ใน SQL Server สามารถที่จะถอดหรือใส่ CPU เพิ่มได้ โดยที่ไม่ต้อง Shutdown Server ครับ รวมทั้งการเพิ่ม Memory ด้วย

แต่ทำได้เฉพาะ Microsoft SQL Server 64-bit และต้องเป็นรุ่น Enterprise เท่านั้นครับ

ในทางปฏิบัติจะมีประโยชน์มาก ในกรณีที่มี user เข้ามาเยอะๆ แล้วเกิด memory ไม่พอ ก็สามารถที่จะเพิ่ม memory ได้ทันทีโดยที่ไม่ต้อง shutdown ครับ เหมาะมากสำหรับ databse server ที่ต้องการ online ตลอด 24 ชม. โดยพอจะสรุปเงื่อนไขได้ดังนี้ครับ

Requirements for hot add CPU:

  • Server และ Hardware จะต้องรองรับ hot add CPU.
  • Windows Server จะต้องเป็น 64-bit edition of Windows Server 2008 Datacenter หรือ Windows Server 2008 Enterprise Edition for Itanium-Based Systems operating system.
  • SQL Server จะต้องเป็น SQL Server Enterprise.
  • SQL Server จะต้องไม่ config เพื่อไปใช้ soft NUMA รายละเอียดลอง click ดูรายละเอียด

หลังจากเพิ่ม CPU เข้าไป จะต้อง run คำสั่ง RECONFIGURE SQL Server ถึงจะเห็น CPU ตัวใหม่ที่เพิ่มเข้าไปครับ

 

Requirements for hot add Memory:

  • Server และ Hardware จะต้องรองรับ hot add Memory
  • Windows Server จะต้องเป็น Windows Server 2003 เป็นอย่างน้อย และเป็นรุ่น Enterprise หรือ Datacenter editions
  • SQL Server จะต้องเป็น SQL Server Enterprise และเป็น 64-bit SQL Server
  • สามารถเป็น 32-bit SQL Server ได้แต่จะต้อง Enabled AWE ขึ้นมาด้วยครับ

การใช้ SQL Server 32-bit จะต้อง start ด้วย switch –h สามารถดูรายละเอียดเพิ่มเติมได้จาก Using the SQL Server Service Startup Options

 

หลักสูตรอบรม SQL Server (Click)

 http://s10.histats.com/204.swf

Categories: SQL Server

40+ Cool Features of Microsoft Expression Blend

Categories: Programming

Microsoft Robotics Studio Free!!

Categories: Programming

ข้อแตกต่างระหว่าง Server.Transfer vs. Response.Redirect


System Requirement

  • ASP.NET

คำถามจากผู้อ่าน

มีถามกันเข้ามาเยอะเหมือนครับ ว่าเวลาต้องการเปลี่ยน page ใน asp.net ค่อนข้างสับสนระหว่าง Server.Transfer กับ Response.Redirect ว่าจะใช้ตัวไหนดีเพราะว่าใช้แล้วก็ได้ผลลัพธ์เหมือนกัน เลยค่อนข้างสับสน ก็ขออนุญาตอธิบายดังนี้ครับ

ก่อนอื่นต้องบอกก่อนว่า Server.Transfer หรือ Response.Redirect ก็คือการที่ Server ส่ง page ใหม่มาให้ที่ browser นั่นเองครับ ซึ่งเป็นวิธีการที่ง่ายที่สุดวิธีหนึ่งดังตัวอย่าง code ดังนี้ครับ

Response.Redirect(“products.aspx”);

หรือ

Response.Redirect(“http://www.microsoft.com”);

ส่วนการทำการของ Server.Transfer ก็จะมีการเขียนแบบเดียวกัน เช่น

Server.Transfer(“products.aspx”);

มองดูแล้วก็งงใช่ไหมครับ รู้สึกว่าไม่เห็นจะต่างกันตรงไหน เพราะว่าตอนรันก็จะให้ผลลัพธ์เหมือนกันคือทาง server จะส่ง page ใหม่มาให้เราตามที่เราต้องการ แต่ก็พอจะแยกแยะส่วนแตกต่างกันเป็นข้อๆ ได้ดังนี้ครับ

ข้อแรก – Server.Transfer จะอาศัยการทำงานที่ฝั่ง Server ทันที แทนที่จะบอกทาง Browser ให้ทำการ Redirect เลยทำให้สามารถงานได้ค่อนข้างรวดเร็ว ก็เลยมีข้อเสียคือ จะไม่สามารถ ส่ง page ที่อยู่นอกเหนือ Server ได้ จะส่งได้เฉพาะ page ที่อยู่ใน Server ตัวเองเท่านั้นครับ ดังนั้นถ้าอยากจะส่ง page ที่ไม่ได้อยู่ใน server ไปให้ทาง Browser ก็ต้องใช้ Response.Redirect ครับ เช่น

Response.Redirect(“http://www.microsoft.com”);

ข้อที่ 2 – Server.Transfer จะไม่เปลี่ยน URL เลยครับ ประมาณว่าพอเราขอ page ใหม่ ทาง Server ก็จะส่ง page ใหม่มาให้ แต่ในช่อง URL จะไม่เปลี่ยนตามชื่อของ page ใหม่ เพราะฉะนั้นก็อาจจะลำบากถ้า user ต้องการจะสร้าง bookmark เก็บไว้ครับ

แต่ก็มีข้อดีที่ Response.Redirect ทำไม่ได้ก็คือ เราสามารถที่จะกำหนด parameter ตัวที่ 2 ได้ คือ “preserveForm” ดังตัวอย่าง

Server.Transfer(“products.aspx”, true);

การกำหนดค่า “preserveForm” เป็น true จะทำให้ page ชื่อ products.aspx สามารถที่จะเข้าไป access ตัวแปร, control ที่อยู่ในหน้าแรกได้ครับ ด้วยเหตุผลเพราะว่าทั้ง 2 page อยู่ใน scope ของ Server เดียวกันนั่นเอง โดยอาจจะใช้คำสั่ง

Request.Form[“txtName”];

โดยชื่อ txtName เป็น textbox ที่อยู่ในหน้าแรกครับ

สรุปการนำไปใช้งาน

ถ้าเป็นการเปลี่ยน page ภายใน Server เดียวกัน ผมขอแนะนำ Server.Transfer จะได้ผลลัพธ์ที่รวดเร็วกว่า Response.Redirect ครับ

หลักสูตรอบรม: .net programming (click)

Categories: Programming

ครบรอบ 20 ปี Microsoft Windows 3.0

Download IE8 : Add-ons (Thailand Official)


download IE8 Add-ons ได้เลยครับ รับรองว่าเด็ด

http://www.windows7thailand.com/ie8gallery/

การทำ Performance Tuning SQL Query เบื้องต้น (part 6 – Database Design)


ตอนนี้ผมจะได้กล่าวถึงสิ่งที่ควรปฏิบัติในการออกแบบ Database ซึ่งส่วนใหญ่จะหนักไปทาง data storage โดยพอจะสรุปเป็นข้อๆ ได้ดังนี้ครับ

1) ใช้ Normalization เพื่อ Optimize Transactional Process

การทำ Normalization นั้น จะช่วยในมุมการใช้คำสั่ง Insert, Update, Delete ครับ ทำให้เกิด Performance ที่ดีครับ แต่จะมีผลตรงกันข้ามกับคำสั่ง Select เพราะว่าใน Database หลายๆ ตัวที่ผมเคยเจออาจจะพบว่า Query เร็ว แต่ Insert ช้าก็ได้ครับ

2) แยกไฟล์ MDF และ LDF ไว้กันคนละ physical disk

โดยคำสั่ง Insert, Update, Delete จะกระทำกับไฟล์ LDF เป็นหลัก ทั้งนี้ในงาน multi-user ขนาดใหญ่แล้วจะเกิด load read-write อยู่บน physical disk ก้อนเดียวกัน ถ้าเป็นไปได้ก็ควรจะแยกไฟล์ MDF และ LDF ไว้คนละ physical disk ก็จะทำให้เกิดการแบ่ง load read-write ไปไว้คนละ physical disk (ผมเคยทำมาหลายงานแล้ว เร็วขึ้นมา 10 เท่าก็เคยเจอครับ)

3) แยก tempdb ไว้บน harddisk ก้อนใหม่

หลักการจะเหมือนกับการแยกไฟล์ MDF และ LDF ครับ คือการแยก load แต่ tempdb จะเป็น temp สำหรับ database ทุกก้อนที่อยู่ใน Server ครับ ลองคิดดูเล่นๆ สิครับว่า tempdb จะรับงานหนักแค่ไหน ถ้าเป็นไปได้ก็ควรแยก tempdb ไว้คนบน physical disk ต่างหากได้จะดีมากครับ

4) สำหรับ table ขนาดใหญ่ให้ใช้ Table partition

การทำ table partition เป็นการแยก load ทาง horizontal โดยจะทำได้ตั้งแต่ sql server 2005 ขึ้นไป เป็นวิธีการกระจาย load ที่ฉลาดมากที่สุดวิธีหนึ่ง โดยสามารถกำหนดเงื่อนไขในการแบ่ง table เช่น แบ่งตามปีที่ซื้อสินค้า, แบ่งตามแผนก เป็นต้น ส่วนวิธีการสร้าง table partition จะไว้เขียนในตอนต่อๆ ไปครับ

5) สำหรับ database ขนาดใหญ่ให้ใช้วิธีการแยกไฟล์ออกเป็นหลายๆ ไฟล์โดยใช้ File Group

หลักการจะเหมือนกับการทำ partition table แต่เป็นระดับ Database แทน โดยการแยก table กระจายไปแต่ละ physical disk แต่วิธีการแยกเราจะใช้ file group ซึ่งสามารถทำได้ทุกเวอร์ชั่นของ SQL Server

6) เมื่อใช้ Data type แบบ TEXT, NTEXT, IMAGE ให้แยกเก็บต่างหากจาก Table Storage

โดยปกติแล้วการเก็บข้อมูลของ column ที่มี data type เป็น text, ntext, image นั้นจะเก็บอยู่ใน page เดียวกับ column อื่นๆ เพราะฉะนั้น เวลาใช้คำสั่ง select ก็จะทำให้ sql server ไปอ่าน column เหล่านี้ขึ้นมาด้วย ซึ่งถือว่าเป็น column ที่พิเศษ ดังนันจึงควรจะทำการแยก column ที่เป็น text, ntext, image แยกออกมาต่างหาก เพื่อเพิ่ม performance โดยใช้คำสั่ง

EXEC sp_tableoption 'orders', 'text in row', 'ON'

7) พยายามใช้ constraint ที่เป้น built-in เช่น primary key, foreign key, check, default, unique แทนการเขียน trigger ขึ้นมาเอง

contraint ต่างๆ ที่มีอยู่แล้ว ทาง microsoft ได้ทำการทดสอบเรื่อง performance มาเป็นอย่างดีอยู่แล้ว พยายามใช้ built-in เป็นหลักเพื่อให้ได้ performance ที่ดี แต่ถ้า built-in ที่มีอยู่ ไม่สามารถตอบสนองสิ่งที่เราต้องการได้จริงๆ ถืงจะเริ่มนึกถึงการเขียน trigger ขึ้นมาใช้งานเองอีกทีนึงครับ

8 ) แยก Index ไว้คนละ Physical Disk โดยใช้ File Group

การสร้าง index จะทำให้การ access data ทำได้เร็ว แต่ก็ควรที่จะแยก index ไว้คนละ physical disk โดยใช้ file group เหมือนกันครับ รับรองว่าไม่ผิดหวัง

9) ใช้ Disk RAID เพื่อเพิ่ม Performance

สุดท้ายจริงๆ ถ้ามีงบประมาณมากหน่อย ก็อาจจะนึกถึงการซื้อ Hardware RAID Disk ซึ่งจะได้ performance ที่ดีแน่นอน

หลักสูตรอบรม Tuning SQL Server (Click)

Windows Phone 7: Latest Screenshots!

Download Bing Screen Server


มี Screensaver สวยๆ มาให้ Download ครับ

http://www.discoverbing.co.uk/download-centre/screensaver/ 

การ Load Excel File ใน SSIS


System Requirement

  • SQL Server Integration Services 2005 หรือ 2008
  • Sample file download

มาตามคำเรียกร้อง

จากที่มีคำถามมาใน guest book เกี่ยวกับการ Import file Excel และต้องการที่จะให้มีการตรวจสอบว่ามี record หรือไม่นั้น สามารถทำได้โดยใช้ Row Count ครับ หลังจากนั้นเราก็สามารถใช้ File System Task เพื่อทำการลบหรือย้าย folder แต่มีเงื่อนไขตรงที่ว่า Excel File นั้น จะต้องไม่มี Record อยู่เลย มีขั้นตอนง่ายๆ ดังนี้ครับ

เริ่มจากการ new project ขึ้นมาใหม่ แล้วสร้าง Control Flow ดังนี้

จากนั้นสร้าง Data Flow โดยเพิ่ม Row Count เข้าไป

โดยมี Transformation ที่เพิ่มเข้ามาคือ Row Count หลักการของผมก็คือจะใช้ Row count เพื่อนับจำนวน Record ถ้า record ไม่ใช่ 0 ก็สามารถดำเนินขั้นตอนต่อไปได้คือ load data แต่ถ้าเป็น 0 record ก็ให้หยุดการทำงานทันทีครับ

ขั้นตอนต่อไปให้ทำการ สร้างตัวแปร เพื่อเก็บ row count ขอเน้นว่าต้องเป็น package scope นะครับ

หลังจากนั้นก็เข้าไปแก้ไข Row Count โดยทำการ Set Output ให้กับตัวแปร ดังนี้

ทีนี้เราก็จะเข้าไปตั้งเงื่อนไข โดยออกไปสร้างที่ Control Flow โดยเชื่อม Data Flow Task กับ File System Task ในที่นี้อาจจะตั้งเงื่อนไขว่าถ้า Row Count = 0 ให้ลบไฟล์ทิ้ง

โดยเขียนสูตร ดังนี้ครับ

หลังจากนั้นลอง run package ดู

ในตอนแรกจะได้ผลลัพธ์คือจะไม่ run file system task ครับ เพราะว่า นับ row count ได้เกิน 0 record

ต่อไปผมจะทดลองโดยการลบ Record ทั้งหมด ที่อยู่ใน Excel ครับ ให้เหลือ 0 Record

แล้วลองรันดูอีกครั้งหนึ่ง ตามคาดครับ คราวนี้ File System จะทำงานครับ ในทางปฏิบัติ เราอาจจะกำหนดให้ File System Task ทำการลบ หรือย้ายไฟล์ก็ได้ครับ

หลักสูตรอบรม SQL Server (Click)