[MSSQL] สรุปงาน SQL Server Community Thailand Meeting #02

สำหรับมางาน 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
  • 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 ที่เกี่ยวข้อง
  • 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

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 - ดึงทีสนใจ
    • 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 รับรู้ และดึงมาแสดงผลได้
  • Power BI - Save ได้ไฟล์ .pbix
  • Q&A #01 - สามารถกำหนดสิทธิของกับข้อมูลได้ไหม ?
    • Ans ได้ กำหนดสิทธิการเห็นข้อมูลได้ แต่ผู้บริหารเห็นทั้งหมด และหัวหน้าส่วนภาคต่างๆ ดูได้เฉพาะของพื้นที่ตัวเองเป็นต้น
  • Q&A #02 - สาย DEV ของ Office มีตัว VSTO ให้มาทำส่วนเสริม (AddIns) ของ Office ได้ ใน Power BI มีอะไรคล้ายกันไหม ?
    • Ans มีตัว Power BI เปิดใช้ ทำตัว Custom Visuals

สุดท้ายของกินภายในงานครับ มีโดนัทด้วย แต่ลืมถ่ายไว้

This slideshow requires JavaScript.

 


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.