รู้ได้อย่างไรว่า Microsoft SQL Server มีประสิทธิภาพแย่ลง

รู้ได้อย่างไรว่า Microsoft SQL Server มีประสิทธิภาพแย่ลง
ผู้เขียนเลยจำเป็นต้องตอบโดยใช้เกณฑ์ที่เรียกว่า “Rule of Thumb” หรือค่าคร่าว ๆ ที่บอกต่อกันมา เป็นคำตอบให้
ผู้เขียนมักอ้างอิงเกณฑ์จากแหล่งเหล่านี้
- คำแนะนำจาก Microsoft
- คำแนะนำจากผู้ผลิตเครื่องมือที่ใช้ติดตามประสิทธิภาพ Microsoft SQL Server โดยเฉพาะ เช่น
- SentryOne
- Redgate
- คำแนะนำจาก Guru ที่น่าเชื่อถือ เช่น
- SQLskills โดย Paul S. Randal อดีตทีมพัฒนา Microsoft SQL Server ตั้งแต่ยุคแรกๆ
- SQL Server Diagnostic Information Queries โดย Glenn Berry อดีตทีมงานของ SQLskills สามารถติดตาม Blogs เก่าได้บน SQLskills และ Blogs ใหม่ได้บน glennsqlperformance
มักเรียกว่า Performance Baseline หรือ Performance Matric
ฟังไม่ผิดครับว่าเกณฑ์ของตนเอง แล้วมันจะน่าเชื่อถือกว่าของบรรดา Guru ได้อย่างไร ติดตามอ่านกันต่อได้เลย
Performance Baseline
โดยมีเอกสารสั้นมาก เอกสารหนึ่งเป็นเครื่องยืนยัน https://docs.microsoft.com/en-us/sql/relational-databases/performance/establish-a-performance-baseline
ในหลักสูตรฝึกอบรมของสถาบัน 9Expert กำลังจะมีการสอนเกี่ยวกับ Performance Tuning ก็ให้ความสำคัญเกี่ยวกับการสร้าง Performance Baseline ไว้ใช้เช่นกัน
แต่กำลังตัดสินใจอยู่ว่าจะนำเสนอผ่านเครื่องมือราคาแพงอย่าง SQLSentry จาก SentryOne หรือใช้ Pssdiag/Sqldiag Manager ที่เป็น Project Opensource ของ Microsoft ดี หรือใช้ทั้งสองอย่างดี
แต่ก็ไม่ใช่สภาวะไม่มีภาระงานอะไรเลยนะ เป็นสภาวะที่มีภาระงานปกตินี่แหละ และเป็นสภาวะที่ทุกฝ่านยอมรับได้มาใช้เป็นเกณฑ์ ประโยชน์ที่ได้คือ
- สามารถเห็นแนวโน้มด้านประสิทธิภาพที่เปลี่ยนแปลงไปได้
- สามารถนำสภาวะปัจจุบันไปเทียบกับ Baseline เพื่อค้นพบการเปลี่ยนแปลง แล้วแก้ปัญหาได้ง่ายขึ้น
- ช่วยประเมินการบริโภคทรัพยากร และวางแผนทรัพยากรล่วงหน้าได้
เช่น ครั้งนี้ Stored Procedure ชื่อ X ของเราใช้เวลาประมวลผลทั้งสิ้น 5 วินาที แต่ที่บันทึกไว้ใน Baseline บอกว่าใช้เวลาประมวลผลเพียง 2 วินาที แบบนี้ก็ตอบได้ว่า Stored Procedure ชื่อ X มีประสิทธิภาพแย่ลง
- Configuration ทั้งระดับ Instance และระดับ Database เช่นค่า Max Server Memory, Cost Threshold for Parallelism หรือ Max Degree of Parallelism เป็นต้น ค่าเหล่านี้สามารถถูกแก้ไขได้ แต่การแก้ไขโดยขาดความเข้าใจอย่างลึกซึ้ง นำมาซึ่งผลกระทบด้านประสิทธิภาพอย่างยิ่ง
- การบริโภคทรัพยากรทั้ง CPU, Memory และ I/O ผ่าน Performance Counters เพื่อนำมาประเมินแนวโน้ม และวางแผนเพื่อจัดหา หรือจัดการกับทรัพยากรล่วงหน้าได้
- ขนาดของฐานข้อมูล หากแหล่งจัดเก็บข้อมูลถูกใช้งานเต็มความจุเมื่อไหร่ ฐานข้อมูลก็จะหยุดทำงาน เพื่อให้แน่ใจว่ารับมือทันท่วงทีต้องติดตามข้อมูลนี้อย่างสม่ำเสมอ
- Wait Statistics เป็นจุดแรกที่ต้องเข้าไปดูหากพบปัญหาด้านประสิทธิภาพ เพราะเราสามารถระบุถึงสาเหตุที่แท้จริงได้จากจุดนี้ การนำ Wait Statistics ปัจจุบันไปเทียบกับ Baseline จะทำให้เห็นปัญหาแล้วแก้ไขได้
เราสามารถเก็บข้อมูลจากแหล่งข้อมูลต่อไปนี้
- สืบค้นจาก Dynamic Management Objects อาจอยู่ในรูปของ Dynamic Management Views หรือ Dynamic Management Table-Valued Functions
- สืบค้นจาก System Catalog Views
- ข้อมูลดักรับจาก Extended Events
- ข้อมูลดักรับ SQL Trace (สร้างจาก SQL Profiler หรือ sp_trace_create ปัจจุบันแนะนำให้เปลี่ยนไปใช้ Extended Events แทน เพราะ SQL Trace หยุดพัฒนาไปตั้งแต่เวอร์ชั่น 2008)
- Performance Counters บน Performance Monitor ของ Microsoft Windows (หากเป็น Counters ของฝั่ง Microsoft SQL Server สามารถสืบค้นได้จาก Dynamic Management View ชื่อ sys.dm_os_performance_counters)
แล้วทำไมเวลาเราดูกราฟจาก Performance Monitor บน Windows กราฟถึงไม่พุ่งขึ้นอย่างเดียวหล่ะ แต่มีทั้งขึ้นและลงด้วย ลองดูตัวอย่างดังคิวรี่ต่อไปนี้
พบว่าครั้งที่ 1 มีค่า 9,032 Kbytes ครั้งที่ 2 มีค่า 13,920 Kbytes และครั้งสุดท้ายคือ 19,808 Kbytes จะเห็นว่าค่าเป็นบวกสะสมไปเรื่อย ๆ
หากเราคิวรี่ตรง ๆ เราต้องตั้งกลไกให้ทำการดึงข้อมูลในมีความถี่คงที่ ตัวอย่างนี้คือ ทุก 1 นาที หรือ 60 วินาที ดังนั้นหากเอาไปวาดเป็นกราฟจะได้จุดสองจุดคือ
ผู้เขียนต้องการสื่อว่าหากต้องการคิวรี่เอง จะไม่สามารถดูผลตรง ๆ จากคิวรี่ได้ และการคิวรี่ต้องทำกำหนดความถี่ในการ Sampling ข้อมูลให้เท่า ๆ กัน
ค่าที่เห็นในกราฟเป็นค่าเฉลี่ย หากต้องการความแม่นยำสูงต้อง Sampling ให้ถี่ แต่แลกมาด้วยพื้นที่จัดเก็บที่มากขึ้น
และอาจย้อนไปส่งผลกระทบต่อประสิทธิภาพการทำงานของ Microsoft SQL Server
แต่หาก Sampling ห่าง ค่าเฉลี่ยที่ได้อาจมีความแม่นยำน้อยลง แต่ข้อดีคือไม่เปลืองพื้นที่จัดเก็บและส่งผลกระทบต่อประสิทธิภาพการทำงานน้อย
โดยเครื่องมือนี้จะมี GUI เพื่อมารับความต้องการจากเราว่าจะดึงค่าประสิทธิภาพอะไรออกมาแสดงบ้าง สามารถทำงานได้กับ Microsoft SQL Server ตั้งแต่เวอร์ชั่น 2008 จนถึงเวอร์ชั่น 2019 ซึ่งเป็นเวอร์ชั่นล่าสุดเลยทีเดียว
- T-SQL Script ไฟล์นามสกุล .sql
- Command Shell Script ทั้งไฟล์นามสกุล .bat และ .cmd
- VB Script ไฟล์นามสกุล .vbs
- และ Power Shell Script ไฟล์นามสกุล .ps1
แต่เราไม่สามารถดับเบิลคลิกไปที่ไฟล์ตรง ๆ ได้ จำเป็นต้องเรียก Command Prompt แบบ Run as administrator ก่อน
จากนั้นจึงเรียกใช้ไฟล์สคริปต์ชื่อ pssdiag.cmd ดังแสดง
เมื่อสคริปต์รันมาถึงการแจ้งเตือนสีเขียว อย่าเพิ่งกด Ctrl+C เพราะเป็นการดักรับผ่าน SQL Trace และ Extended Event
ให้ดักรับในสภาวะที่มีภาระงานและระบบเป็นปกติ หากต้องการนำไปสร้างเป็น Baseline และดักรับในสภาวะอื่น ๆ ที่ต้องการทำ Benchmarking จนคิดว่าสมควรแก่เวลาค่อยกด Ctrl+C สคริปต์จะแจ้งว่าหยุดดักรับดังแสดง
จากนั้นผลลัพธ์จะถูกบรรจุลงในโฟลเดอร์ Output ภายใต้โฟลเดอร์ที่ทำการรันสคริปต์ โดยมีบรรดาไฟล์ผลลัพธ์ดังแสดง
- ไฟล์นามสกุล .OUT และ .TXT
- เก็บผลลัพธ์ของ PssDiag
- เก็บรายละเอียดการเรียกใช้ SQL Trace
- เก็บรายละเอียดการเรียกใช้ Extended Event
- เก็บผลลัพธ์ของ Stored Procedure
- เก็บข้อมูลที่ Filter มาจาก Error Log ตอนเกิด Shutdown
- เก็บรายละเอียดการเรียกใช้ Powr Plan
- ไฟล์นามสกุล .xel เก็บผลลัพธ์ของการดักรับด้วย Extended Event
- ไฟล์นามสกุล .trc เก็บผลลัพธ์ของการดักรับด้วย SQL Trace
- ไฟล์นามสกุล .sqlplan เก็บรายละเอียด Compile Plan ของ Expensive Query
หากเราต้องอ่านไฟล์เหล่านี้เองคงไม่สะดวกเท่าไหร่ ยังมีอีกโปรเจค Codeplex ชื่อ SQLNexus ปัจจุบันถูกย้ายมาอยู่ที่ GitHub เช่นกัน
สามารถเข้าไปดูและดาวน์โหลดได้ตามลิงก์ https://github.com/microsoft/SqlNexus เราจะใช้ SQL Nexus ทำหน้าที่อ่านผลลัพธ์จาก Pssdiag/Sqldiag
หลังจากฐานข้อมูลถูกสร้าง SQL Nexus จะเริ่มทำการ Import ข้อมูลดังแสดง
ก็จะเห็น Report น่าตาแบบนี้ให้ใช้งาน
และยังมีข้อมูลดิบจัดเก็บลงตารางต่าง ๆ ในฐานข้อมูล sqlnexus ดังแสดง
จะเห็นว่ามีการสรุปผลการวิเคราะห์ออกมาให้ โดยแบ่งเป็นระดับความแรงบอกไว้ด้วยคอลัมน์ TypeDesc และคำอธิบายในคอลัมน์ Description ไปจนถึงลิงก์ที่ให้รายละเอียดเพิ่มเติมใน InternalUrl เป็น Path
ภายใน HTML Report ที่ได้มา หรือคอลัมน์ ExternalUrl เป็นลิงก์ไปยังไซต์ในอินเตอร์เน็ต ซึ่งแน่นอนว่าคำแนะนำแบบนี้เข้าข่ายเป็น “Rule of Thumb” แต่ก็ไม่เสียหลายหากเราจะตั้งต้น Baseline จาก “Rule of Thumb” ที่น่าเชื่อถือ
สรุป
Baseline ควรถูกสร้างตอนมีภาระงานอยู่แต่ทำงานได้อย่างปกติ และอาจมีหลาย Baseline ได้ตามความแตกต่างของภาระงาน
และ Baseline ไม่ควรถูกสร้างครั้งเดียวแล้วใช้เป็นเกณฑ์ไปตลอด ควรมีการปรับให้ทันสมัยอาจทุกๆ 3 เดือนเป็นอย่างน้อย
แต่หากไม่มีเครื่องไม้เครื่องมือราคาแพง การสร้างสคริปต์ขึ้นมาใช้เองก็สามารถทำได้ แต่ต้องรู้ว่าจะไปหยิบจับค่ามาจากไหน และค่าอะไรบ้าง
ผู้เขียนมีตัวอย่างสคริปต์แจกให้ในหลักสูตร SQL Server Performance Tuning ฝึกอบรม และอธิบายโดยละเอียดถึงค่าแต่ะค่าที่ใช้เป็นเกณฑ์วัดประสิทธิภาพโดยละเอียด
และไม่เพียงวิเคราะห์จากค่าประสิทธิภาพเท่านั้น ยังแสดงตัวอย่างการวิเคราะห์ Expensive Query ที่พบมากให้ผู้เข้าอบรมเห็นอีกด้วย
ส่วนบทความทำนองนี้ผู้เขียนอาจเอาบรรดา “Rule of Thumb” ที่น่าเชื่อถือมาเล่าให้ฟังกัน โปรดติดตามบทความกันต่อไปนะครับ
- วิทยากรผู้ดูแลและออกแบบหลักสูตร
- กลุ่มวิชา SQL Server/Window Server
- Microsoft SQL Server Specialist
- Microsoft Certified Trainer (2002-Present)
- Co-Founder at Data Meccanica Co., Ltd.