SQL เป็นภาษาแบบ Declarative (กำหนดผลลัพธ์ที่ต้องการ ไม่ใช่ขั้นตอนการทำงาน) หน้าที่ของ Query Optimizer คือการคำนวณและสร้างแผนการทำงาน (Execution Plan) ที่มีประสิทธิภาพสูงสุด (Lowest Cost)
การวิเคราะห์ Execution Plan เป็นทักษะสำคัญที่ช่วยในการตรวจสอบปัญหาประสิทธิภาพ (Performance Tuning) และเข้าใจพฤติกรรมของ Database Engine
- ระดับ 1 – อ่าน Execution Plan ได้อย่างถูกต้อง
- แยก Logical/Physical Operators, เข้าใจ Seek/Scan/Key Lookup, Join Types, และการอ่าน Estimated vs Actual Rows
- ระดับ 2 – ระบุปัญหาที่มองเห็นจาก Plan
- ตรวจพบ Missing Index, Implicit Conversion, Spill, Parallelism ผิดที่ และเชื่อมโยงกับ I/O/CPU จาก DMV/PerfMon ได้
- ระดับ 3 – ใช้ Live Query Stats และ IQP ช่วยวิเคราะห์ปัญหา
- ใช้ Live Query Statistics,
sys.dm_exec_query_profiles, และฟีเจอร์ Intelligent Query Processing (เช่น Memory Grant Feedback, Scalar UDF Inlining) เพื่อยืนยันสมมติฐาน
- ใช้ Live Query Statistics,
- ระดับ 4 – ออกแบบแนวทาง Tuning ตาม Best Practice
- ปรับปรุง Query/Index ให้สอดคล้องกับแนวทางจาก Query Processing Architecture Guide และ Performance Center (โฟกัสที่ Plan Quality ก่อน Scale Hardware) ได้เป็นขั้นตอน
| # | Section |
|---|---|
| 1 | Query Optimizer |
| 2 | Execution Plan Formats |
| 3 | Analyzing Query Plans |
| 4 | Intelligent Query Processing |
คู่มือปฏิบัติแบบ Instruction + Code block: Labs/README.md — สคริปต์ประกอบอยู่ใน Sections/*/Scripts/ ตามหัวข้อ
2. Key Lookup (Bookmark Lookup) คืออะไร และทำไมถึงส่งผลเสีย?
คือ operations ที่ต้องกระโดดจาก Non-Clustered Index กลับไปอ่านข้อมูลฉบับเต็มที่ Clustered Index (Heap) เนื่องจาก NCI ไม่มี Column ที่ต้องการครบ ถ้าทำเยอะๆ จะเปลือง I/O มหาศาล3. Implicit Conversion คืออะไร?
การแปลง Data Type โดยอัตโนมัติเนื่องจาก Type ไม่ตรงกัน (เช่นเทียบ `VARCHAR` กับ `NVARCHAR`) ซึ่งมักจะทำให้ใช้ Index ไม่ได้ (Index Scan แทน Seek)|:--------|:------------|:----------|
| Adaptive Joins | 2017 (DB compat 140) | เลือก join strategy หลัง scan แถวแรก |
| Memory Grant Feedback | 2017 / persisted ใน 2019+ | ปรับ grant จาก spill/overgrant รอบก่อน |
| Interleaved Execution (MSTVFs) | 2017 | หยุด optimize เพื่อรู้ค่า card จริงก่อน |
| Scalar UDF Inlining | 2019 | UDF สเกลาร์แปลงเป็น relational expressions |
| Batch Mode on Rowstore | 2019 | รับ batch mode ได้แม้ไม่มี columnstore |
| Table Variable Deferred Compilation | 2019 | ใช้ card จริงของ table variable |
| Parameter Sensitive Plan Optimization (PSPO) | 2022 (compat 160) | หลาย plan ต่อ statement สำหรับ data ที่เบ้ |
| Degree of Parallelism (DOP) Feedback | 2022 → เปิด default ใน 2025 | ปรับ DOP อัตโนมัติตาม repeatable query |
| Optional Parameter Plan Optimization (OPPO) | 2025 (compat 170) | ต่อยอด PSPO สำหรับ query แบบ optional parameters (@p IS NULL OR col = @p) |
| CE Feedback for Expressions | 2025 | เรียนรู้ CE ของ expression ข้าม query |
- ตรวจสอบ/ตั้ง compat level 170 เพื่อเปิดใช้ฟีเจอร์รุ่น 2025:
ALTER DATABASE AdventureWorks2025 SET COMPATIBILITY_LEVEL = 170;
- ใช้
sys.query_store_planColumnhas_compile_replay_script/ XEvent ของ IQP ติดตามการทำงานของ feedback
อ้างอิง: Intelligent Query Processing, What's new in SQL Server 2025 — Query Store and IQP