SQL Server - Learn & More

SQL Server - Learn & More SQL Sever

02/05/2026

Trong quá trình tối ưu query với Microsoft SQL Server, rất nhiều developer mắc một sai lầm phổ biến: tối ưu dựa trên cảm giác. Thêm index theo suy đoán, rewrite query theo kinh nghiệm cá nhân, nhưng không kiểm chứng SQL Server thực sự đang làm gì phía sau.

Ex*****on Plan (kế hoạch thực thi) chính là “bản đồ” cho bạn biết database engine đang truy cập dữ liệu ra sao, join kiểu gì, sort như thế nào và tốn tài nguyên ở đâu. Nếu không đọc Ex*****on Plan, việc tối ưu gần như là mò mẫm trong bóng tối.

Bài viết này sẽ giúp bạn hiểu đầy đủ cách đọc, phân tích và tối ưu dựa trên Ex*****on Plan – theo hướng thực chiến.

1. Ex*****on Plan là gì?
Ex*****on Plan là mô tả chi tiết cách SQL Server thực thi một câu lệnh T-SQL. Nó cho bạn biết:

SQL dùng Index Seek hay Table Scan?
Join bằng Nested Loop hay Hash Match?
Có Sort không?
Có Key Lookup không?
Estimated rows có khớp với Actual rows không?
Có hai loại:

Estimated Ex*****on Plan – kế hoạch ước lượng trước khi chạy.
Actual Ex*****on Plan – kế hoạch thực tế sau khi chạy (quan trọng hơn).
Trong SQL Server Management Studio, bạn bật Actual Ex*****on Plan bằng Ctrl + M.

2. Cách đọc Ex*****on Plan đúng cách
Nguyên tắc 1: Đọc từ phải sang trái

Ex*****on Plan chạy theo chiều từ phải qua trái. Operator ngoài cùng bên phải là nơi dữ liệu được truy xuất đầu tiên.

Nguyên tắc 2: Tìm operator có % cost cao nhất

Operator nào chiếm tỷ lệ cost cao thường là điểm nghẽn chính.

Nguyên tắc 3: So sánh Estimated vs Actual Rows

Nếu ước lượng sai nghiêm trọng → SQL có thể chọn sai chiến lược join → query chậm.

3. Các Operator Quan Trọng Nhất
3.1 Table Scan (Nguy hiểm với bảng lớn)

SQL quét toàn bộ bảng.

Xảy ra khi:

Không có index phù hợp
WHERE không SARGable
Implicit conversion
Với bảng vài triệu record → rất tốn I/O.

3.2 Index Seek (Tối ưu)

SQL tìm đúng vị trí dữ liệu trong index.

Luôn muốn thấy Seek thay vì Scan.

3.3 Index Scan

Quét toàn bộ index. Tốt hơn Table Scan nhưng vẫn là quét toàn bộ.

3.4 Key Lookup (I/O killer)

Xảy ra khi:

SQL dùng index để tìm key
Nhưng cần thêm cột không có trong index
Phải quay lại clustered index để lấy dữ liệu
Nếu xảy ra hàng chục nghìn lần → rất chậm.

Giải pháp: tạo Covering Index.

3.5 Nested Loop

Tốt khi:

Một bảng nhỏ
Bảng còn lại có index
3.6 Hash Match

Thường dùng khi:

Join bảng lớn
Không có index tốt
Tốn RAM. Có thể spill ra tempdb.

3.7 Sort

Sort tốn CPU và memory. Nếu không có index theo ORDER BY, SQL buộc phải sort.

Đọc đầy đủ bài viết ở link comment.

26/04/2026

TỐI ƯU STORED PROCEDURE & QUERY TRONG DATABASE

I. TỐI ƯU QUERY

1. Tạo Index đúng cách (Quan trọng nhất)

- Index cho cột trong WHERE
- Index cho cột trong JOIN
- Index cho cột trong ORDER BY
- Index cho cột trong GROUP BY
- Với composite index: cột lọc nhiều nhất đặt trước

2. Tránh SELECT *

- Chỉ select các cột cần dùng
- Giảm IO, memory và network traffic

3. Tránh dùng Function trong WHERE Sai: WHERE YEAR(CreatedDate) = 2026
Đúng: WHERE CreatedDate >= ‘2026-01-01’ AND CreatedDate <
‘2027-01-01’

4. Hạn chế OR

- Ưu tiên dùng IN
- Hoặc tách thành UNION ALL nếu cần

5. Dùng EXISTS thay vì IN khi subquery lớn

6. Pagination chuẩn

- SQL Server: OFFSET FETCH
- PostgreSQL: LIMIT OFFSET
- Bảng lớn nên dùng Keyset Pagination

7. Kiểm tra Ex*****on Plan

- Tránh Table Scan
- Ưu tiên Index Seek
- Bật STATISTICS IO, TIME để đo hiệu năng

------------------------------------------------------------------------

II. TỐI ƯU STORED PROCEDURE

1. Tránh Parameter Sniffing (SQL Server)

- Dùng OPTION (RECOMPILE)
- Hoặc gán tham số sang biến local

2. Hạn chế Dynamic SQL

- Nếu cần dùng thì dùng sp_executesql

3. Tránh Transaction quá dài

- Chỉ wrap phần cần commit DB
- Không call API trong transaction

4. Giảm số lần round-trip DB

- Trả nhiều result set trong 1 Stored Procedure

5. Tránh dùng Cursor

- Ưu tiên Set-based query
- Dùng MERGE hoặc UPDATE FROM

------------------------------------------------------------------------

III. TỐI ƯU THIẾT KẾ DATABASE

1. Chuẩn hóa hợp lý

- Không over-normalize
- Hệ thống read-heavy có thể denormalize

2. Dùng đúng Data Type

- Không dùng NVARCHAR(MAX) nếu không cần
- Chọn size phù hợp để tiết kiệm bộ nhớ

3. Partition Table khi dữ liệu rất lớn

- Theo ngày / tháng / năm

------------------------------------------------------------------------

IV. CACHE & KIẾN TRÚC

1. Dùng Redis cache cho dữ liệu read-heavy
2. Áp dụng CQRS (tách Read & Write DB)
3. Dùng Background Job cho xử lý nặng

------------------------------------------------------------------------

CHECKLIST KHI QUERY CHẬM

- Có Table Scan không?
- Index có được dùng không?
- Có function trong WHERE không?
- Có implicit conversion không?
- Join có dư thừa không?
- Data type có mismatch không?

------------------------------------------------------------------------

ƯU TIÊN TRIỂN KHAI

1. Tạo index đúng
2. Kiểm tra ex*****on plan
3. Bỏ SELECT *
4. Refactor query
5. Tối ưu Stored Procedure
6. Áp dụng cache nếu cần

08/04/2026

KIẾN TRÚC VÀ CHIẾN LƯỢC ĐÁNH INDEX TRONG SQL SERVER: TỐI ƯU HÓA HIỆU NĂNG DỮ LIỆU LỚN

1. GIỚI THIỆU VỀ INDEX (CHỈ MỤC)
Trong quản trị cơ sở dữ liệu, Index (chỉ mục) thường được ví như mục lục của một cuốn sách dày hàng nghìn trang. Thay vì phải lật từng trang (Table Scan) để tìm một thông tin cụ thể, bạn chỉ cần tra cứu mục lục để biết chính xác trang cần đến (Index Seek).

Về mặt kỹ thuật, Index là một cấu trúc dữ liệu trên đĩa (on-disk structure) gắn liền với một bảng hoặc view, giúp tăng tốc độ truy xuất hàng dữ liệu. Tuy nhiên, việc sử dụng Index là một "con dao hai lưỡi" – nó đòi hỏi sự cân bằng tinh tế giữa tốc độ đọc và tốc độ ghi.

2. CÁC LOẠI INDEX PHỔ BIẾN
SQL Server cung cấp nhiều loại chỉ mục, nhưng quan trọng nhất là hai loại:

A. Clustered Index (Chỉ mục cụm)
- Đặc điểm: Sắp xếp và lưu trữ dữ liệu vật lý của bảng dựa trên khóa chỉ mục. Vì dữ liệu chỉ có thể được sắp xếp theo một thứ tự duy nhất, mỗi bảng chỉ có duy nhất một Clustered Index.
- Cấu trúc: Các nút lá (leaf nodes) của Clustered Index chính là các trang dữ liệu thực tế.
- Lời khuyên: Thường được tạo mặc định trên cột Primary Key. Nên chọn các cột có giá trị tăng dần (như IDENTITY) để tránh hiện tượng phân mảnh trang (Page Splitting).

B. Non-Clustered Index (Chỉ mục không cụm)
- Đặc điểm: Có cấu trúc tách biệt hoàn toàn với dữ liệu của bảng. Nó chứa các giá trị khóa và mỗi giá trị khóa có một con trỏ (Row Locator) dẫn đến hàng dữ liệu thực tế.
- Cấu trúc: Giống như mục lục ở cuối sách, liệt kê từ khóa và số trang.
- Ưu điểm: Có thể tạo nhiều Non-Clustered Index trên một bảng để hỗ trợ các kiểu truy vấn khác nhau.

3. PHÂN TÍCH ƯU ĐIỂM
- Tăng tốc độ truy vấn (SELECT): Đây là lợi ích lớn nhất. Các câu lệnh có điều kiện WHERE, JOIN, hoặc toán tử so sánh (>,

Address

Đường Số 8
Thủ Đức District

Alerts

Be the first to know and let us send you an email when SQL Server - Learn & More posts news and promotions. Your email address will not be used for any other purpose, and you can unsubscribe at any time.

Contact The Business

Send a message to SQL Server - Learn & More:

Shortcuts

Share