สำหรับมางาน SQL Server Community Thailand Meeting งานนี้จัดเป็นครั้งที่ 2 แล้ว ส่วนงานแรกผมพลาด เพราะติดสอบพอดี โดยในวันนี้มี 2 หัวข้อใหญ่ครับ ได้แก่
- SQL Server Performance Tuning Essential โดยคุณ Chulladej Aramsri
- Power BI Desktop โดยคุณ Chalaivate Pipatpannawong
SQL Server Performance Tuning Essential โดยคุณ Chulladej Aramsri
- หมายเหตุ: เขียนในมุมของ Developer หากมีอะไรผิดพลาด ขออภัยมา ณ ที่นี้ครับ
- Root-Cause ของ Perdormance หลักๆ ที่พบบ่อยๆ จากมากไปน้อย
- T-SQL - เกิดจากการ Query เขียนไม่ดี
- Poor Index Strategy - วาง Index ผิด หรือไม่เหมาะสม เช่น Table นี้ Write เยอะ แต่ทำ Index เยอะ แต่ความจริง Index ช่วยให้การ Read ให้เร็วขึ้น
- Note: SQL Server มี index 2 แบบ Row Store กับ Column Store ต้องเลือกใช้ และ Control ให้ดี
- ถ้าเลือก Index ไม่เป็น ก็อย่าใส่ Index เลย มันบาปป
- I/O SubSystem
- Application Code - Code ของ Dev แหละ เช่น ใน Loop 1 ครั้ง แวะไปเยี่ยม DB ก่อน ทั้งที่ความจริงมันกวาดมาบางส่วนก่อนได้ (อันนี้ส่วนตัวผมเจอเยอะนะ)
- DB Schema Design
- Out-of-date /missing statistic
- SQL Server Configuration - ตัว MS SQL Server การ Tuning มีรายละเอียดปลีกย่อยในแต่ละ Version โดยการ Tuning เริ่มทำตั้งแต่ติดตั้ง แต่ส่วนใหญ่กด Next รัวๆ กัน
- Virtulization / Hardware Problem และ CPU Power Saving มีน้อยมาก ถ้าดูจากรูป
- แล้วปกติที่ไปจัดการกับ Data ที่ทำผ่าน SQL มันมีแบบไหนบ้าง
- Adhoc - เขียน Query สดๆ หรือ เป็น String ที่ฝั่งไว้ในตัว Application
- Stored Procedure - ตัว DBMS มีการเตรียมพร้อมไว้แล้ว มันเร็วกว่าแบบ Adhoc แต่ขึ้นกับวิธีการเขียน Logic ด้วยนะครับ เช่น ตัว Cursor ถ้าใช้ไม่เป็นให้มันอ่านที่ละ Row มันก็ช้าได้ ปกติตัว DBMS อยากได้อะไรเป็นชิ้นๆ ส่งไปปุบ DB ไป Process ได้ผลลัพธ์เป็นชิ้นกลับมาเลย
- Commond Approach ในการ Optimize Performance โดยเริ่มจากสิ่งที่ควรทำมากที่สุดลงไป
- Schema Design - พื้นฐานสำคัญที่สุด
- Query Optimization - แยกเรื่อง ทำให้เหมาะสม
- Indexing - เน้นอ่าน
- Locking
- Deadlock ( 1205) - Resource ถูกยึดไว้
- Blocking - น่ากลัวกว่า เพราะ มันไม่มี Error Number เอาง่ายๆ ตัว DBMS ไม่สามารถ Detect ได้ แบบ Deaklock (ส่วนตัวเข้าใจว่า Blocking = Starvation หรือ livelock ของการทำ Multithread นะ)
- Server Turing ควรทำตั้งแต่ต้น ควรทำตั้งแต่ Design
- Memory ตัว SQL Server DMV มันกิน Mem เอาไว้ Cache
- I/O - ssd เขียนพอๆกับ disk หมุน Data File อยู่คนละ Physical Drive กับ Log File เราจับกลุ่ม Table แล้วแยกไฟล์ Data ของ DB เป็นหลายไฟล์
- CPU
- Wait Statistic Performance Tuning Approach
- ใช้เมื่อทำ Commond Approach แล้ว ยังช้า ยังมีปัญหาด้าน Performance อยู่
- สนใจงานที่รอทำงานอยู่ (Wait) ทำไม ? มันยังไม่เสร็จ เอามาวิเคราะห์จริงๆ มันช้า ที่ DB หรือ App เขียนไม่ดีแล้ว DB ช้าตาม Query ของ App
- Back to Basic ก่อนจะรู้เรื่อง Wait Statistic เราควรรู้อะไรบ้าง
- Three Network Protocal ที่ MS SQL Support
- Shared Memory - ถ้าช้า ลองรันที่เครื่อง DB เรา ผ่าน SSMS เลย จะได้รู้ที่มันดึงข้อมูลช้า เกิดจากตัว Network หรือป่าว ?
- Name Pipes
- TCP/IP
- สำหรับในส่วนของ Application Layer ใช้ตัว abular Data Stream Protocol(TDS) ซึ่งใช้ได้กับ MSSQL ทุก Version ที่นิยมใช้ในปัจจุบัน รวมถึงบน Azure ด้วย
- Query LifeCycle จาก Query ที่เราส่งมาจาก App ของระบบงานที่พัฒนา หรือจาก SSMS มันต้องผ่านอะไรบ้าง
- อย่าง Network
- ถัดมาเข้า DB Engine
- DB Engine มันส่วนประกอบอะไรบ้าง
- Query Execution Layer - มาตรวจก่อน ว่า Query Syntax ถูกไหม มันคิดยาก หรือป่าว ถ้าง่าย SELECT * FROM ไป Query ตรงๆเลย แต่ถ้ายากใน Layer นี้ไปวางแผน หากลยุทธ์ เพื่อให้มันทำงานอย่างมีประสิทธิภาพที่สุดครับ โดยในแบบนี้ตัว DB สร้างตัว Execution Plan ขึ้นมาครับ
- Storage Engine Layer - เอา Plan จาก Query Execution Layer มาใช้ใน Layer จัดพื้นที่ โดยตัว SQL มันมองเป็น Page เหมือนหนังสือ ว่าจะเอาข้อมูลตรงไหนมา
- SQLOS - MSSQL มี OS ของตัวเอง โดยทำงานเป็น User Mode OS (ถ้าสาย ComSci เรียนวิชา OS มันมี 2 Mode คือ Kernel Mode กับ User Mode
- ทำ Wait Statistic ทำนี้
- low - level ที่จัดการ Resource, ทำ Scheduling, จัดการ I/O, Locking, จัดการ Transation, Deadlock, Exception และอื่นๆ
- คุมงานที่ส่ง ป้อนให้ CPU ไปทำงาน
- ถ้าลง DB แล้ว พยายามอย่าให้ Server ทำงานอื่นเสริม รวมทั้ง Service ของ MS เช่น ลง Service อย่าง Reporting / Analysis
- ในตัว DMV ของกลุ่ม sys.dm_os_xxx เป็นตัวที่มา Track ดูการทำงานของ SQLOS
- NOTE: ผมเพิ่งรู้ว่าตัว MSSQL Server มัมี OS ชั้นนี้ ปกติสนใจพวก Query Execution Plan มากกว่า
- NUMA System
- NUMA node แบ่งกลุ่มให้ CPU เข้าไปให้ Memory แต่ละผืนที่จองไว้ จากเป็น CPU 8 Core
- 1 CPU ต่อ 1 Scheduler โดยเราสามารถปรับได้ที่ตัว Server Properties และกำหนด CPU ที่ใช้ตัว MSSQL มันใช้งานได้
- ตัว CPU เองมันทำงานจริงได้ 1 งาน ตัว SQLOS ส่งไปเข้าที่ละ Task ให้มันเผา
- ถ้ามีหลาย NUMA node พยายามเลือกใช้ CPU ใน Node เดียวกันให้ MSSQL เพราะ ถ้าทะลึ่งเลือกกันกระจายไปหลายๆ Node พอเวลามันใช้ข้อมูลจาก อีก Node มันต้องผ่านเส้น InterConnect ทำให้มันช้า
- เวลามี Query เข้ามาจาก Client / App Server หรือ Web Server มันจอง 1 Session เอาไว้ โดยที่
- 1 Session มีหลาย Request
- 1 Request มี หลาย Task โดย Task เป็นตัวที่ CPU ต้องรีบเอางานไปเผาให้เร็วที่สุด
- โดยใช้ตัว sys.dm_exec_requests เรารู้ว่ามีงานทำงาน Backgroud อยู่เท่าไหร่ ใช้ CPU อย่างไรบ้าง มี Status อะไรบ้าง เวลาดูให้ดูเบอร์ที่มากกว่า 50 น้อยกว่านั้นเป็นของ System
- Three Network Protocal ที่ MS SQL Support
- Preemptive vs Non-Preemptive
- Preemptive - จัดความสำคัญ Windows พอใช้ CPU หนักๆ เช่น เล่มเกม / Process EOD ตัว OS จัดงานนี้มีความสำคัญเยอะสุด
- Non Preemptive - ทุกงานมีความสำคัญเท่ากัน ไม่ว่าจะงานใหญ่ หรืองานเล็ก ไม่สนว่าแต่ละ Task ทำทันไหม ตัวอย่างการทำงาน MSSQL
- Note: ถ้า MSSQL ต่ำกว่า 2000 ใช้แบบ Preemptive แต่ Version หลังๆ ใช้แบบ Non Preemeptive
- MSSQL 2000 ยังไม่มี DMV ครับ
- MSSQL-Non Preemptive Scheduler
- ในแต่ละ Task มีเวลาทำงานเท่าๆกัน คือ 1 Quantum (4 ms) ถ้า CPU ทำทันจบ แต่ถ้าทำไม่ทัน มันวนเก็บไว้ใใน List เข้า Queue ไว้
- ตัว List ที่สำคัญของ MSSQL
- Worker List - งานส่งไปเผาไปให้ CPU เผา
- Runable List - งานที่รอเผา โดยส่งไปเป็น Worker ทำงานเป็น FIFO
- Waiter List - งานที่เผาไปแล้ว แต่ไม่เสร็จ เกินเวลา 1 Quantum (4 ms) จะถูกวนมาเก็บใน List นี้ โดยตัว MSSQL เก็บข้อมูลตรงนี้ เอาไปทำ Wait Statistic
- I/O List
- Time List
- กลับมาที่ Wait Statistic
- พอเข้าใจแนวคิดแล้ว ว่าตัว MSSQL มันแตกงานย่อยที่สุดเป็น Task โดยแต่ละ Task ต้องส่งไปเผา(Worker List) ถ้างานมันใหญ่เผาไม่หมด ถูกย้าย (Waiter List) พักไว้ ซึ่งถ้าแต่ละงานมันสัมพันธ์กัน แสดงว่างานที่ถูก Waiter ไปมันถูก Suspend รอให้ต้องรองานนั้นทำให้เสร็จก่อน จริงๆ เราเอาตรงนี้มาดูพวก Blocking ได้นะ
- Wait & Queue
- Wait ถ้าเป็นที่ Resource รองาน รอ I/O - ระบบแสดง Suspend
- Wait ถ้าเป็นที่ Signal จาก CPU- ระบบแสดง Runable
- Queue - งานใน Worker List ที่ทำไม่เสร็จ
- DMV ที่เกี่ยวข้อง
- sys.dm_os_wait_stats -
- sys.dm_os_waiting_tasks -
- sys.dm_exec_session_wait_stats - เพิ่งมาใน SQL Server 2016 ++ โดยดูที่ละ Session ได้เลย
- Wait Statistic - Wait Type ที่เราพบเอกกันบ่อยๆ
- LCK_M_* - Lock ที่ resource เจอเยอะๆไม่ดี
- PAGELATCH_* - บอกว่ามีปัญหาระหว่าง Memory กับ Disk มี page ที่ถูกแย่งกันใช้งานเยอะ วิธีแก้ปัญหา เพิ่ม DataFile(.mdf) หรือทำ Partition
- PAGEIOLATCH - บอกว่ามีปัญหาระหว่าง Disk กับ Memory วิธีแก้ปัญหา มีเงินปรับ I/O หรือไม่ทำ Index ให้ DB มัน Update ค่า Stat ใหม่ หรือง่ายที่สุด ปรับที่ Query เราเองที่ทำ Table Scan หนักๆ
- CXPACKET - ดี เพราะ ตัว MSSQL Server ใช้ Parallel Plan (ต้องดูจาก Execution Plan) มีการใช้ Scheduler มากว่า 1 ตัว ช่วยกันทำงานมากกว่า 1 CPU โดยปกติใช้ CPU ตัวเดียว ทำให้ Query มีการทำงานอย่างมีประสิทธิภาพ ถ้าจะปรับต้องไปดู MAXDOP
- WRITELOG - ถ้ามันมีเยอะไป แสดงว่า I/O ของ Log มีปัญหา
- Tools เอาไปไว้ใช้ดู Performance
- Useful Resource
- SQL Global Meetup - http://www.pass.org/default.aspx
- SQLSkills - https://www.sqlskills.com/sql-server-resources/
- สำหรับ Script ในการจัดการตรวจสอบสามารถดูได้จากของคุณ Glenn Berry
- Virtual Labs - https://www.sqlskills.com/sql-server-resources/
- Facebook Group: SQL Server Community Thailand
Power BI Desktop โดยคุณ Chalaivate Pipatpannawong
- ตัว Power BI เป็น Tools ที่เกิดมา เพื่อเล่นกับ Data โดยเฉพาะ และสามารถรองรับข้อมูลจำนวนมากได้ ถ้าใน Excel แบบเดิม มันจะถึงจุดนึงที่ Excel มันเดี้ยง และเอาข้อมูลนั้นมาแสดงผลให้น่าดึงดูด และมีลูกเล่น (Visualization)
- ตัว Power BI App มี 3 แบบ
- Desktop - จัดการข้อมูล ทำ Model
- Service อยู่บน Cloud - เป็น Software As A Service เท่าที่ฟังมา ผมเข้าใจว่าตัวนี้เป็ฯแกนหลักนะ
- Mobile - เน้นการ View ดู เพื่อเอาข้อมูลสร้าง Value
- ขั้นตอนการทำ มี 5 Step
- Get Data
- สามารถเอาข้อมูลจากหลายแหล่ง Multi Source เอาอะไรมายัดก็ได้ครับ อาทิ
- Microsft Family พวก SQL Server / Azure หรือ พวก MS Office Excel เป็นต้น
- Text File - CSV
- ของค่ายอื่นอย่าง Oracle (พวก DB เป็นต้น)
- หรือจาก Service อย่าง Google Analytic
- และอื่นๆ Step การทำงานหลัก มี 5 ส่วน
- Note: การเอาข้อมูลเข้ามาใน Power BI มี 2 Mode
- Import - ดึงมาหมด ช้าในตอนแรก
- Direct Query - ดึงทีสนใจ
- สามารถเอาข้อมูลจากหลายแหล่ง Multi Source เอาอะไรมายัดก็ได้ครับ อาทิ
- Design
- Clean Data - ทำพวก ETL จัดการข้อมูลเรียบร้อยให้พร้อมใช้งาน
- Data Model - สามารถนำข้อมูลมาเทรวมกัน และสร้างความสัมพันธ์กันได้
- Visualization - ทำให้มันดูง่ายขึ้น โดยสร้าง Report หรือ Dashboard ซึ่งของตัว Poewer BI มันเป็น Interactive ทำให้ข้อมูลมันมีลูกเล่น เปลี่ยนตามเงื่อนไขของผู้ใช้
- Design Once Access All Device
- พวกสูตรเหมือน Excel ใช้ DAX Syntax ช่วยได้
- แต่ถ้ามันซับซ้อนสามารถใช้ภาษาที่ฮิตๆ ในการทำ Data Science อย่างภาษา R เข้ามาจัดการได้
- เพิ่ม Q&A เวลา Public ขึ้นเว็บมีตัวช่วยให้ User สามารถค้น และการแสดงผลของข้อมูลตาม User ได้
- Publish - เอาข้อมูลขึ้นเว็บ เพื่อให้คนอื่น เอา Model(Dashboard, Report) ที่ได้จาก Power BI ไปใช้งาน
- Access - ดูได้จาก App ทั้ง 3 หรือ Get Code ไป Embled บน เว็บได้ ตัวอย่าง 9experttraining
- Sync - ถ้าข้อมูลมีข้อมูลมาใหม่ สามารถเติมเข้าไปได้ แล้วตัว Model ที่สร้างจาก Power BI รับรู้ และดึงมาแสดงผลได้
- Get Data
- Power BI - Save ได้ไฟล์ .pbix
- Q&A #01 - สามารถกำหนดสิทธิของกับข้อมูลได้ไหม ?
- Ans ได้ กำหนดสิทธิการเห็นข้อมูลได้ แต่ผู้บริหารเห็นทั้งหมด และหัวหน้าส่วนภาคต่างๆ ดูได้เฉพาะของพื้นที่ตัวเองเป็นต้น
- Q&A #02 - สาย DEV ของ Office มีตัว VSTO ให้มาทำส่วนเสริม (AddIns) ของ Office ได้ ใน Power BI มีอะไรคล้ายกันไหม ?
- Ans มีตัว Power BI เปิดใช้ ทำตัว Custom Visuals
สุดท้ายของกินภายในงานครับ มีโดนัทด้วย แต่ลืมถ่ายไว้
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts to your email.