SQL Server: Join table with varchar, nvarchar size

Byphunsanit

SQL Server: Join table with varchar, nvarchar size

การ Join table ใน SQL Server โดยที่ column varchar ที่นิยมตั้งชื่อ เดียวกัน อย่าง wp_id, pp_username ทั้งตาราง master และ relation จะได้หากันง่าย ๆ แต่เจอว่ามี ขนาดคอลัมน์ (Size) ไม่เท่ากัน ในส่วนของการ join สามารถทำได้และจะยังได้ผลลัพธ์ที่ถูกต้อง แต่จะมีผลกระทบต่อประสิทธิ์ภาพ และความดูเป็นมืออาชีพในการออกแบบ เพราะ …

1. ประสิทธิภาพ (Performance Impact)

หากขนาดไม่เท่ากัน SQL Server อาจต้องทำ Implicit Conversion (การแปลงข้อมูลโดยอัตโนมัติ) เพื่อให้ข้อมูลทั้งสองฝั่งอยู่ในประเภทเดียวกันก่อนจะนำมาเปรียบเทียบ

  • CPU Usage: การแปลงข้อมูลทุกแถวขณะ Join จะกินทรัพยากร CPU มากขึ้น
  • Index Usage: หากคอลัมน์หนึ่งเป็น varchar(50) และอีกคอลัมน์เป็น varchar(100) แล้วตัว Query Optimizer ตัดสินใจแปลงข้อมูลฝั่งที่มี Index อาจทำให้ SQL Server ไม่สามารถใช้ Index นั้นได้ (Index Scan แทนที่จะเป็น Index Seek) ส่งผลให้ Query ช้าลงอย่างมาก

2. ความเสี่ยงเรื่อง Data Truncation (ในการ Insert/Update)

แม้การ Join จะไม่มีปัญหา แต่ในจังหวะที่คุณนำข้อมูลจากตารางที่มีขนาดใหญ่กว่า ไปใส่ในตารางที่มีขนาดเล็กกว่า (เช่น INSERT INTO ... SELECT ... JOIN) จะเกิด Error “String or binary data would be truncated” หากข้อมูลจริงมีความยาวเกินขนาดคอลัมน์ปลายทาง

3. มาตรฐานการออกแบบ (Design Consistency)

การที่คอลัมน์ที่เป็น Key เดียวกันแต่มีขนาดไม่เท่ากัน สะท้อนถึงปัญหาด้าน Data Integrity หรือการออกแบบ Database Schema ที่ไม่เป็นไปตามมาตรฐาน ซึ่งอาจทำให้ผู้ร่วมงานคนอื่นสับสนได้ว่าตกลงแล้วความยาวที่ถูกต้องควรเป็นเท่าไหร่

ตารางสรุปเปรียบเทียบ

สถานการณ์ผลลัพธ์ผลกระทบ
Join varchar(50) กับ varchar(100)สำเร็จอาจช้าลงถ้า Index ไม่ถูกนำมาใช้
Join varchar กับ nvarcharสำเร็จช้ามาก เพราะต้องแปลง Unicode (เป็นสาเหตุหลักของประสิทธิภาพตก)
Insert ข้อมูลยาว 100 ลงใน field 50ล้มเหลวError: Data Truncation

ข้อแนะนำ

  1. ทำให้เท่ากัน: หากเป็นไปได้ ควรปรับ ALTER TABLE ให้ขนาดคอลัมน์ที่เป็น Key สำหรับ Join มีขนาดเท่ากันและ Data Type เดียวกันเป๊ะๆ
  2. ก่อนจะทำการ ALTER COLUMN เพื่อปรับขนาด ควรทำการ Backup Database หรือทำ Snapshot ไว้ก่อนเสมอ เพราะการเปลี่ยน Schema อาจใช้เวลานานและ Lock Table ได้หากตารางมีขนาดใหญ่

อ่านเพิ่มเติม

About the author

phunsanit administrator