SQL Server Extended Events (XE) là công cụ giám sát hiệu năng cho phép theo dõi, phân tích và xử lý mọi hành vi trong SQL Server — từ slow query, deadlock, index scan cho tới memory pressure và I/O bottlenecks.

1. Cấu trúc của Extended Events
🧩 Events: Một sự kiện mà SQL Server ghi nhận, như một truy vấn SQL được thực thi, hoặc một lỗi hệ thống xảy ra.
📐 Actions: Thêm thông tin bổ sung cho sự kiện, chẳng hạn như thời gian truy vấn, tên người dùng, địa chỉ IP.
🧲 Session: Một nhóm các sự kiện được cấu hình cùng nhau để theo dõi trong một phiên duy nhất. Ta có thể tạo nhiều session cho các mục đích khác nhau.
📦 Targets: Nơi lưu trữ dữ liệu sự kiện (ví dụ: tệp, bảng trong cơ sở dữ liệu, hoặc bộ đệm trong bộ nhớ).
2. Cấu hình và sử dụng SQL Server Extended Events
2.1. Tạo một session XEvents đơn giản
Ví dụ, tạo một session để theo dõi các truy vấn bị chậm (sql_statement_completed)
CREATE EVENT SESSION SlowQueries ON SERVER
ADD EVENT sqlserver.sql_statement_completed
(
    ACTION(sqlserver.client_hostname, sqlserver.username)
    WHERE (duration > 1000)  -- Chỉ ghi nhận các câu lệnh mất hơn 1 giây
)
ADD TARGET package0.asynchronous_file_target
(
    SET filename = 'C:\temp\slowqueries.xel'
);
+ Event: sqlserver.sql_statement_completed theo dõi khi câu lệnh SQL hoàn thành.
+ Action: Thu thập thông tin client_hostname username của người dùng thực thi câu lệnh.
+ Condition: Chỉ ghi lại các truy vấn có thời gian thực thi > 1000ms.
+ Target: Lưu kết quả vào một tệp (slowqueries.xel).
2.2. Kích hoạt session
Sau khi tạo session, ta cần kích hoạt nó: ALTER EVENT SESSION SlowQueries ON SERVER STATE = START;
2.3. Dừng và xóa session
Khi không theo dõi sự kiện nữa, ta có thể dừng và xóa session:
ALTER EVENT SESSION SlowQueries ON SERVER STATE = STOP;
DROP EVENT SESSION SlowQueries ON SERVER;
2.4. Truy vấn dữ liệu từ tệp sự kiện
Khi session hoạt động, ta có thể truy vấn dữ liệu từ tệp .xel:

SELECT *
FROM sys.fn_xe_file_target_read_file('C:\temp\slowqueries*.xel', NULL, NULL, NULL);
3. Các sự kiện hữu ích trong SQL Server
+ sqlserver.sql_statement_completed: Giúp theo dõi các câu lệnh SQL, thời gian thực thi, và các thông tin liên quan (như người dùng, tên host).
sqlserver.sp_statement_completed: Giúp hiểu rõ các câu lệnh được thực thi trong các stored procedure và các vấn đề tiềm ẩn.
sqlserver.transaction_log: Giúp theo dõi và phân tích các hoạt động của giao dịch, ví dụ như commit, rollback, hoặc các thay đổi dữ liệu.
sqlserver.errors_logged: Giúp theo dõi lỗi hệ thống, truy vấn, và các sự cố trong SQL Server.
sqlserver.login:  Hữu ích cho việc giám sát đăng nhập của người dùng và xác định các vấn đề bảo mật hoặc bất thường trong hệ thống.
sqlserver.logout: Giúp hiểu rõ hơn về hành vi đăng nhập và thoát của người dùng trong hệ thống.
sqlserver.deadlock_graph: Giúp phát hiện và phân tích các deadlock, từ đó cải thiện hiệu suất và tránh các tình huống khóa dữ liệu.
sqlserver.lock_acquiredsqlserver.lock_released: Theo dõi các hoạt động liên quan đến khóa (lock), bao gồm khi một khóa được cấp hoặc giải phóng.
sqlserver.query_post_execution_showplan: Thu thập thông tin về kế hoạch thực thi của một truy vấn sau khi truy vấn được thực thi.
sqlserver.resource_semaphore_waits: Theo dõi các tình huống chờ đợi tài nguyên, chẳng hạn như bộ nhớ hoặc CPU. Giúp xác định các vấn đề về tài nguyên, như thiếu bộ nhớ, gây ảnh hưởng đến hiệu suất của hệ thống.
sqlserver.page_io_latch_waits: Theo dõi các sự kiện liên quan đến việc chờ đợi latch khi đọc hoặc ghi dữ liệu từ/đến trang dữ liệu. Giúp phát hiện các vấn đề về I/O, đặc biệt là trong các hệ thống có dữ liệu lớn hoặc yêu cầu truy cập I/O cao.
sqlserver.sql_batch_completed: Giúp theo dõi các batch SQL (ví dụ như các câu lệnh T-SQL) để xác định hiệu suất hoặc các vấn đề liên quan đến một nhóm câu lệnh.