Chúng tôi có cơ sở dữ liệu SQL nặng (SQL Server 2008) và tốc độ chèn giảm sau một thời gian. Tôi đã đọc những câu hỏi tương tự: Tốc độ chèn Sql tăng tốc , SQL: Điều gì làm chậm INSERT nếu không phải CPU hoặc IO? và tăng tốc độ CHỨNG MINH .
Ngoài ra, tôi đã đọc bài đăng này về cách phân tích hiệu suất của SQL Server giúp tôi biết cách tìm ra các nút cổ chai (ví dụ: bằng cách truy vấn sys.dm_exec_requests
và sys.dm_os_wait_stats
), nhưng tôi vẫn gặp khó khăn trong việc diễn giải kết quả truy vấn và khắc phục sự cố.
Đầu tiên, tôi bắt đầu với truy vấn sys.dm_exec_requests
chỉ trả về một id phiên (chọn truy vấn) với trạng thái "đang chạy" (nghĩa là tôi không tìm thấy BÀI VIẾT NÀO). Vì vậy, nếu không có gì chặn phần chèn của tôi, tại sao nó trở nên chậm?
Tiếp theo, tôi đã sử dụng sys.dm_os_wait_stats
để kiểm tra số liệu thống kê về tất cả các loại chờ. Kết quả cho thấy LATCH_EX, CXPACKET VÀ PAGEIOLATCH_SH có nhất wait_time (694.379 ms, 310.364 ms và 308.335 ms tương ứng).
Sau đó, tôi đã sử dụng sys.dm_os_latch_stats
để tìm loại chốt phổ biến nhất mà trong trường hợp của tôi là ACCESS_METHODS_DATASET_PARENT
.
- Trước hết, tôi không biết cách tìm truy vấn liên quan đến từng session_id trong kết quả truy vấn
sys.dm_exec_requests
. - Thứ hai, số lượng thời gian chờ (trong
sys.dm_os_wait_stats
) nên được coi là cao? Và nếu các số được đề cập ở trên (kết quả của sys.dm_os_wait_stats) cao, làm thế nào tôi có thể giảm chúng? - Theo tôi hiểu,
ACCESS_METHODS_DATASET_PARENT
có liên quan đến sự song song và một trong những giải pháp tôi tìm thấy là giảm mức độ song song. Có đúng không? - Trong MySQL, có một số cài đặt điều chỉnh có thể được thực hiện ngay sau khi cài đặt (ví dụ: tăng kích thước nhóm bộ đệm innodb), có gì tương tự trong SQL Server không?
Một số thông tin thêm:
Sử dụng
sys.dm_db_index_usage_stats
, số lần đọc và ghi lần lượt là 80336 và 70672.Một trong những bảng bận rộn nhất của chúng tôi là
trans_all
(hiển thị tất cả các giao dịch thanh toán) với KHÔNG TRIGGERS, KHÔNG CONSTRAINTS (điều này giống nhau cho tất cả các bảng), nhưng nó có INDEX CLUSTERED, cụ thể,PK_trans_all
bao gồm các cột sau: gs_id (smallint), pt_id (tinyint), Fueling_time (datetime), buy_type (tinyint).Kích thước cơ sở dữ liệu là 2,6 GB và kích thước của
trans_all
bảng là 155 MB.
CẬP NHẬT_1
Về ACCESS_METHODS_DATASET_PARENT
, tôi đã thử giải pháp mà tôi đã tìm thấy (nghĩa là thay đổi mức độ song song. Tôi đã thay đổi nó thành 1 để đảm bảo truy vấn đó không bao giờ đi đến song song), nhưng nó không khắc phục được vấn đề: | Tôi có nên thay đổi nó một lần nữa? mặc định mà tôi nên sử dụng là gì?
CẬP NHẬT_2
Tôi vừa kiểm tra kích thước tệp nhật ký giao dịch cho cơ sở dữ liệu của mình là 2,4 GB và% không gian nhật ký được sử dụng là 98%. Đây có thể là lý do để làm chậm chèn của tôi? Tôi có nên tăng kích thước tệp nhật ký?
Ngoài ra, tôi thường sys.database_files
kiểm tra kích thước tệp và dung lượng trống cho cơ sở dữ liệu của mình. Kết quả cho thấy kích thước tệp là 195 MB và dung lượng trống là 0.187 MB .
gs_id, pt_id, fueling_time, purchase_type
) không? Nếu vậy, tôi hy vọng các phần chèn không nằm ở cuối các bảng như bạn đã nói và bạn đang gặp phải một số lượng lớn các phân chia trang trong khi chèn.