Làm thế nào để có được hiệu suất truy vấn chính xác?


9

Tôi đang cố gắng cải thiện hiệu suất của một thủ tục được lưu trữ. Khi tôi chạy SP, nó kết thúc gần như ngay lập tức, như thể có gì đó được lưu trữ. Tôi được yêu cầu sử dụng hai dòng SQL sau đây trước khi thực hiện SP trong SSMS:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Khi tôi chạy SP với hai dòng mã phía trên SP kết thúc sau khoảng 8 giây. Tuy nhiên, điều này có thực sự mang lại cho tôi thời gian thực hiện thực sự (như thể tôi chạy nó từ một ứng dụng) không? Làm sao tôi biết?


Câu trả lời:


9

Những lệnh đó làm hai việc:

  • Xóa bộ đệm trang, nơi lưu trữ các trang dữ liệu đã được truy xuất từ ​​đĩa (thông thường yếu tố lớn nhất trong thời gian truy vấn là truy cập đĩa)
  • Xóa bộ đệm của kế hoạch truy vấn, có nghĩa là máy chủ cần tạo một gói truy vấn mới. Điều này thường không đáng kể ngoại trừ khối lượng giao dịch rất cao.

Về cơ bản, bạn đang có một thời gian tương đương với kịch bản "trường hợp xấu nhất" - bạn vừa khởi động lại máy chủ và không có gì trong bộ nhớ. Các lần chạy tiếp theo không cần phải trả chi phí để lấy dữ liệu từ đĩa vì các trang đó đã được tải vào bộ nhớ.

Điều này tương tự như tình huống trong thế giới thực - người dùng đầu tiên của bạn để chạy một truy vấn cụ thể có thể sẽ phải chờ lâu hơn so với các lần chạy tiếp theo, giả sử bạn đang kiểm tra cùng một dữ liệu.

Một phương pháp tốt mà tôi muốn sử dụng là chạy nhiều lần và lấy trung bình. Điều này đặc biệt hữu ích trong môi trường dùng chung vì bạn không có toàn quyền kiểm soát các tài nguyên được chia sẻ như tempdb.

Bạn cũng có thể sử dụng các lệnh này để có thêm thông tin về những gì thực sự xảy ra đằng sau hậu trường:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Chúng sẽ cung cấp cho bạn thông tin chi tiết về các lần đọc trang từ đĩa (trên mỗi đối tượng), đọc trang logic, thời gian biên soạn kế hoạch và thời gian thực hiện truy vấn.


câu trả lời tuyệt vời như JNK thông thường.
OO

Vui vẻ giúp đỡ! Bạn tình cờ được đặt câu hỏi về những điều tôi đã giải quyết rất nhiều. Nếu bạn hỏi về sao chép hoặc quản lý bộ nhớ, tôi sẽ không có nhiều thứ để thêm :)
JNK

2
Tôi biết về THIẾT LẬP THỐNG KÊ IO, nhưng tôi chưa bao giờ biết về THỐNG KÊ THỜI GIAN TRÊN. Cảm ơn JNK.
datagod

2
Chỉ cần FYI bạn có thể nhận được rất nhiều thông tin này mà không cần tất cả các cài đặt SET bằng cách tạo các gói thực tế bằng SQL Sentry Plan Explorer. Và để có được nhiều lần chạy (giả sử, 5), bạn chỉ cần kết thúc đợt GO 5giống như trong SSMS. Đây là một bản tải xuống miễn phí, tôi không cố bán cho bạn bất cứ thứ gì. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand

1
@JNK tốt, chắc chắn, nó miễn phí, nó tiết kiệm thời gian và nó hiển thị thông tin không thể hoặc rất cồng kềnh khi thoát khỏi Management Studio. Và tôi làm việc ở đó. :-)
Aaron Bertrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.