Giới thiệu
Truy vấn SQL mô tả kết quả mong đợi, không phải là cách để nhận được kết quả. Tập hợp các bước cụ thể mà máy chủ phải thực hiện để trả về kết quả được gọi là kế hoạch thực thi truy vấn. Kế hoạch được xây dựng bởi trình tối ưu hóa. Việc lựa chọn một kế hoạch ảnh hưởng đến tốc độ thực thi, điều khiến nó trở thành một trong những yếu tố quan trọng nhất của phân tích vấn đề hiệu suất truy vấn.
Kế hoạch thực thi bao gồm các toán tử và các thuộc tính của chúng tương quan với nhau dưới dạng cấu trúc cây. Mỗi nhà điều hành chịu trách nhiệm cho một hoạt động logic hoặc vật lý riêng biệt. Tất cả cùng nhau, chúng đảm bảo kết quả được mô tả trong văn bản truy vấn. Bên trong cây, các toán tử được đại diện bởi các đối tượng lớp trong bộ nhớ của SQL Server. Người dùng máy chủ (nghĩa là bạn và tôi) thấy mô tả được tạo ở định dạng XML với một lược đồ cụ thể, được hiển thị bằng đồ họa bởi môi trường SQL Server Management Studio (SSMS).
Có nhiều nhà khai thác gói khác nhau và thậm chí nhiều tài sản hơn. Bên cạnh đó, những cái mới xuất hiện theo thời gian. Bài viết này không dám mô tả tất cả các toán tử đa dạng có thể có. Thay vào đó, tôi muốn chia sẻ những bổ sung thú vị nhất trong chủ đề này và nhắc nhở một số yếu tố cũ nhưng hữu ích.
Phiên bản máy chủ
Đôi khi bạn có thể tìm thấy các yêu cầu cho phiên bản máy chủ trên các diễn đàn, ngay cả khi kế hoạch truy vấn được cung cấp ở định dạng chính xác (XML). Thay vào đó, bạn có thể tiết kiệm thời gian và mở kế hoạch thực thi dưới dạng XML. Và phần tử đầu tiên mô tả kế hoạch sẽ hiển thị cho bạn phiên bản máy chủ trong thuộc tính Build.
Phương pháp này không cho phép truy xuất thông tin đầy đủ về phiên bản máy chủ, nhưng trong hầu hết các trường hợp, nó đủ để hiểu những gì chúng tôi xử lý.
Số lượng hàng trong bảng
Câu hỏi thường gặp thứ hai là “Bảng của bạn chứa bao nhiêu hàng?”. Thông tin này cũng có thể được truy xuất từ kế hoạch truy vấn (như từ phiên bản máy chủ 2008). Đối với điều này, chúng tôi cần chọn toán tử truy cập dữ liệu (Quét hoặc Tìm kiếm) của bảng được đề cập và xem xét TableCardinality bất động sản. Có một thuộc tính thú vị khác, Kích thước hàng ước tính, để biết đặc điểm kỹ thuật của kích thước hàng và đánh giá gần đúng kích thước bảng hoặc chỉ mục (với điều kiện là bảng không được nén).
Tôi muốn lưu ý rằng đây không phải là số hàng thực trong bảng mà là dữ liệu từ thống kê đối tượng. Tuy nhiên, dữ liệu này là cơ sở cho các quyết định mà trình tối ưu hóa đưa ra khi tạo truy vấn.
Ngữ cảnh
Kế hoạch truy vấn lưu các cài đặt SET đáng chú ý mà nó được xây dựng cho. Để xem cài đặt, bạn cần chọn một phần tử gốc trong kế hoạch và mở rộng Đặt tùy chọn bất động sản. Ví dụ:chúng ta có thể tìm hiểu xem kế hoạch có được xây dựng bằng ARITHABORT hay không tùy chọn được kích hoạt (sự khác biệt của cài đặt này thường dẫn đến hai kế hoạch và tình huống khác nhau với khả năng đánh giá thông số không tốt).
Số lượng CPU
Chúng tôi có thể truy xuất số lượng bộ xử lý có sẵn cho trình tối ưu hóa. Đối với điều này, chúng tôi cần mở OptimizerHardwareDependentPropertie s -> Ước tínhAvailableDegreeOfParallelism trong cùng một phần tử gốc và nhân nó với 2. Nếu chỉ có một bộ xử lý thì không cần nhân.
2 * 2 =4, 4 CPU có sẵn. Thật vậy, tôi có một bộ xử lý 4 lõi trên máy tính của mình và tất cả 4 lõi đều có sẵn cho máy chủ. Thông tin này có thể giúp bạn phát hiện máy đã tạo kế hoạch.
Phiên bản công cụ ước tính số lượng
Kể từ SQL Server 2014, một số phiên bản của Công cụ ước tính Cardinality (RU) đã trở nên khả dụng. Cơ chế này ảnh hưởng đến hầu hết các quyết định mà trình tối ưu hóa thực hiện khi chọn một kế hoạch. Bạn có thể truy xuất phiên bản của Công cụ ước tính số lượng từ CardinalityEstimationModelVersion thuộc tính của toán tử gốc.
- 0 - Máy chủ SQL <=2012
- 120 - SQL Server 2014
- 130 - SQL Server 2016
- 140 - SQL Server vNext
Thời gian thực thi truy vấn và thời gian chờ
Như từ SQL Server 2016 SP1, kế hoạch truy vấn thực tế có thông tin về thời gian thực thi và thời gian xử lý. Để truy xuất dữ liệu này, bạn cần mở rộng QueryTimeStats trong phần tử gốc và xem các giá trị của CpuTime và ElapsedTime . Chúng tôi không cần bật tính năng thu thập thời gian thực thi hoặc hỏi "truy vấn đã được thực thi trong bao lâu?" nữa - tất cả thông tin này đều có trong kế hoạch.
Cải tiến đáng chú ý thứ hai là top 10 thời gian chờ lâu nhất trong quá trình thực thi truy vấn. Đối với điều này, chúng tôi cần mở rộng Trạng thái chờ thuộc tính trong phần tử gốc. Việc bổ sung này cho phép nhận được lý do chính xác hơn của việc thực thi truy vấn chậm và đơn giản hóa đáng kể việc chẩn đoán.
Các loại tham số
Danh sách tham số thuộc tính liệt kê các tham số được sử dụng trong truy vấn, đã tồn tại trong kế hoạch từ lâu. Tuy nhiên, từ SQL Server 2016 SP1, Kiểu dữ liệu tham số thuộc tính đã được thêm vào định nghĩa tham số. Thuộc tính này lưu trữ kiểu dữ liệu của tham số. Nó có thể hữu ích để hiểu các vấn đề với chuyển đổi kiểu.
Số lượng hàng đã đọc và số lượng hàng ước tính được đọc
Kế hoạch thực thi bao gồm hai thuộc tính rất quan trọng, Số lượng hàng thực tế và Số lượng hàng ước tính. Các thuộc tính này chứa thông tin về số hàng được trả về bởi toán tử đọc dữ liệu, nhưng không phải số hàng mà toán tử đọc dữ liệu thực sự đã đọc. Thuộc tính Số lượng hàng đã đọc và Số lượng hàng được ước tính sẽ trả lời câu hỏi này và cho phép truy xuất số hàng mà máy chủ đã thực sự đọc hoặc sẽ đọc. Thuộc tính ActualRowsRead (Number of Rows Read in SSMS) khả dụng từ SQL Server 2012 SP3, 2014 SP2, 2016 SP1. Ước tínhRowsRead Thuộc tính (Số lượng hàng ước tính được đọc trong SSMS) khả dụng từ SQL Server 2016 SP1.
Thống kê IO và Thời gian Thực thi Người vận hành
Có một số thuộc tính rất hữu ích được thiết lập trong SQL Server 2016, 2014 SP2 và có sẵn trong kế hoạch truy vấn thực tế. Chúng là số liệu IO (nếu nhà điều hành có IO) - Thống kê IO thực tế, số liệu CPU và thời gian thực thi - Thống kê thời gian thực tế và số liệu bộ nhớ (kể từ 2016 SP1, nếu nhà điều hành yêu cầu bộ nhớ).
Các thuộc tính bao gồm các chỉ số mới sau đây có thể được chia thành các chuỗi trong trường hợp kế hoạch song song:
- ActualElapsedms
- Thực tếCPUms
- Quét thực tế
- ActualLogicalReads
- ActualPhysicalReads
- ActualReadAheads
- ActualLobLogicalReads
- ActualLobPhysicalReads
- ActualLobReadAheads
- InputMemoryGrant
- OutputMemoryGrant
- usedMemoryGrant
Như bạn có thể thấy từ danh sách ở trên, bạn có thể truy xuất thông tin toàn diện về việc thực thi bất kỳ toán tử nhất định nào, IO đã sử dụng và bộ nhớ. Trong các phiên bản cuối cùng của SSMS, các chỉ số này được thể hiện trong cửa sổ thuộc tính. Nếu bạn sử dụng phiên bản SSMS cũ, bạn có thể truy xuất chúng bằng cách mở gói dưới dạng XML. Theo ý kiến của tôi, bây giờ có tất cả mọi thứ để hiển thị phần trăm không phải theo chi phí ước tính, mà bằng các tài nguyên thực tế đã trôi qua (Tôi đã tạo một đề xuất tại Connect. Vì vậy, nếu bạn thích ý tưởng đó, hãy bình chọn cho nó).
Thông tin về Cờ theo dõi được bật
Cờ theo dõi trong SQL Server là các 'chuyển mạch' đặc biệt từ hành vi máy chủ mặc định sang một số hành vi khác nhau. Như từ SQL Server 2014 SP2 và 2016 SP1, thông tin về cờ theo dõi đã bật sẵn có trong thuộc tính TraceFlags của phần tử cụ thể. Nó có thể bao gồm tối đa 100 cờ được bật đồng thời tại thời điểm xây dựng truy vấn.
Thông tin về Tràn dữ liệu sang tempdb
Một số toán tử kế hoạch, chẳng hạn như Sắp xếp hoặc Kết hợp băm, yêu cầu bộ nhớ trong khi thực hiện truy vấn. Tuy nhiên, dung lượng bộ nhớ được tính tại thời điểm biên dịch. Do nhiều lý do khác nhau (ví dụ:đánh giá sai số hoặc hàng được cho là), dung lượng bộ nhớ có thể được tính không chính xác. Nếu bộ nhớ được cấp phát ít hơn mức cần thiết để thực thi, máy chủ sẽ phải đổ dữ liệu sang tempdb. Nó làm chậm quá trình thực thi truy vấn. Thận trọng về tình huống như vậy đã được giới thiệu trong máy chủ 2012, nhưng từ SQL Server 2012 SP3, 2014 SP2, 2016, thông tin chẩn đoán đã được mở rộng và bây giờ nó bao gồm khối lượng dữ liệu tràn và dữ liệu đọc. Vì vậy, bạn có thể đánh giá vấn đề và thực hiện các biện pháp thích hợp.
Kết luận
Kế hoạch thực thi bao gồm nhiều thông tin hữu ích, kế hoạch truy vấn thực tế bao gồm thêm thông tin và kế hoạch truy vấn thực tế trong các phiên bản mới nhất của SQL Server chỉ là một mỏ thông tin hữu ích. Bài viết này không nhằm mục đích dạy ai đó phân tích các kế hoạch truy vấn. Thay vào đó, tôi đã xem xét các thuộc tính kế hoạch thú vị nhất, bao gồm các thuộc tính mới và các thuộc tính cũ nhưng được đánh giá thấp hơn. Tôi hy vọng bài viết này sẽ giúp ích cho bạn vào lần tới khi bạn cần phân tích hiệu suất truy vấn.
Bài viết do nhóm Codingsight dịch với sự cho phép của tác giả.
Công cụ hữu ích:
dbForge Query Builder dành cho SQL Server - cho phép người dùng tạo các truy vấn SQL phức tạp một cách nhanh chóng và dễ dàng thông qua giao diện trực quan trực quan mà không cần viết mã thủ công.