Tại sao hoạt động TOP trong kế hoạch thực hiện SQL


9

Sau khi tìm kiếm một lúc, tôi quyết định đăng câu hỏi này vì không tìm được câu trả lời và xin lỗi nếu có câu hỏi / câu trả lời tương tự ngoài kia.

Khi chạy truy vấn bên dưới trên hai máy chủ SQL được thiết lập tương tự nhau, chúng tôi gặp phải các kế hoạch thực hiện khác nhau ảnh hưởng đến hiệu suất và chúng tôi cần trợ giúp để tìm ra nguyên nhân.

Truy vấn:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Kế hoạch thực hiện của máy chủ A Máy chủ B

Kế hoạch thực hiện của máy chủ B Máy chủ B http://s2.postimg.org/z9fjrfv4n/server_B.png

Bạn sẽ nhận thấy rằng máy chủ B có hoạt động vật lý HÀNG ĐẦU trong kế hoạch thực hiện thực tế và chúng tôi đang cố gắng tìm hiểu tại sao. Cả hai truy vấn đều sử dụng cùng một chỉ mục trong Tìm kiếm chỉ mục.

Dưới đây là một số chi tiết về máy chủ A và máy chủ B

Máy chủ A và B đều

Gói dịch vụ tiêu chuẩn Windows Server 2008 R2 1

RAM 24GB

Hệ điều hành 64 bit

Các phiên bản SQL Server 2012 có được bằng cách sử dụng ( CHỌN SERVERPROPERTY ('ProductVersion') )

Máy chủ A phiên bản SQL 11.0.3000.0

Máy chủ B SQL phiên bản 11.0.5058.0

Những gì chúng tôi đã cố gắng

  1. Xóa bộ nhớ đệm thủ tục
  2. Xây dựng lại chỉ số
  3. Làm mới số liệu thống kê
  4. THIẾT LẬP ROWCOUNT 0 với hàng và đi

Tại sao máy chủ B có TOP trong kế hoạch thực hiện? Trong ví dụ truy vấn đơn giản này không có vấn đề thực sự nhưng trong một truy vấn lớn hơn, chi phí tăng lên cho TOP và chúng ta thấy một hiệu suất đạt được. Bất kỳ trợ giúp gỡ lỗi này sẽ được đánh giá cao và chúng tôi có thể giúp bạn có thêm thông tin bạn cần để giúp đỡ.


Các TOPnhà điều hành cho một tổ chức phi zero SET ROWCOUNTtrước đây được thực hiện trên kết nối đó. Hãy thử lại với sau khi thực hiện SET ROWCOUNT 0;. Ngoài ra, các phiên bản SQL bạn đã đăng không phải là SQL 2008 R2. Chạy SELECT SERVERPROPERTY('ProductVersion');trên 2 máy chủ để có phiên bản SQL Server thực tế.
Dan Guzman

Tôi đã cập nhật bài viết gốc với các phiên bản sql bằng cách sử dụng truy vấn chọn được cung cấp. Các máy chủ mà sql được cài đặt trên là máy chủ windows 2008 R2 trong khi các máy chủ sql được cài đặt là 2012. Như đã đề xuất trước đó bởi một thành viên khác, chúng tôi đã thử đặt ROWCOUNT thành 0 mà không thay đổi trong kế hoạch thực hiện. Xem câu hỏi cập nhật
Arthur Yegiazaryan

Bạn có thể đặt một GOdòng sau hàng đếm. Bạn cũng có thể đăng các thuộc tính của toán tử hàng đầu?
Rob Farley

Rob, đã thêm GO và các thuộc tính từ TOP vào bài gốc
Arthur Yegiazaryan

Câu trả lời:


12

Kiểm tra để đảm bảo mức độ tương thích cơ sở dữ liệu giống nhau trên 2 máy chủ. Tôi đã chạy thử nghiệm nhanh trên phiên bản SQL Server 2012 và thấy toán tử TOP được giới thiệu nếu mức độ tương thích là 100 hoặc thấp hơn. Trừ khi bạn có một lý do cụ thể để làm khác, tốt nhất là sử dụng mức độ tương thích 110 (SQL Server 2012) trên phiên bản SQL Server 2012.


2

Tôi nghĩ bạn có một giá trị cho ROWCOUNT. Làm:

SET ROWCOUNT 0

... để tắt nó đi.


1
SET ROWCOUNT 0 đã không xóa TOP khỏi kế hoạch thực hiện
Arthur Yegiazaryan

1
@Arthur Mặc dù đó không phải là giải pháp trong trường hợp của bạn , nó có thể là lý do cho hành vi cho độc giả tương lai. (Xin lỗi Rob, tôi đã tự do xóa bài đăng của bạn vì đây thực sự có thể là vấn đề cho cùng một triệu chứng.)
Aaron Bertrand

Aaron, đồng ý và cảm ơn vì đã mang nó trở lại. Không phải là giải pháp cho tôi nhưng có thể là cho người khác.
Arthur Yegiazaryan
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.