Hiệu suất của SQL Server Linked Server: Tại sao các truy vấn từ xa lại đắt như vậy?


14

Tôi có hai máy chủ cơ sở dữ liệu, được kết nối qua Máy chủ được liên kết. Cả hai đều là cơ sở dữ liệu SQL Server 2008R2 và kết nối máy chủ được liên kết được thực hiện thông qua liên kết "Máy chủ SQL" thông thường, sử dụng bối cảnh bảo mật của thông tin đăng nhập hiện tại. Các máy chủ được liên kết đều ở cùng một trung tâm dữ liệu, vì vậy kết nối không phải là vấn đề.

Tôi sử dụng truy vấn sau đây để kiểm tra giá trị nào của cột identifiercó sẵn từ xa, nhưng không phải cục bộ.

SELECT 
    identifier 
FROM LinkedServer.RemoteDb.schema.[TableName]

EXCEPT

SELECT DISTINCT
    identifier 
FROM LocalDb.schema.[TableName] 

Trên cả hai bảng là các chỉ mục không được nhóm trên cột identifier. Tại địa phương có khoảng 2,6 triệu hàng, chỉ từ xa 54. Tuy nhiên, khi nhìn vào kế hoạch truy vấn, 70% thời gian thực hiện được dành cho "thực hiện truy vấn từ xa". Ngoài ra, khi nghiên cứu kế hoạch truy vấn hoàn chỉnh, số lượng các hàng cục bộ ước tính 1thay vì 2695380(là số lượng các hàng ước tính khi chỉ chọn truy vấn đến sau EXCEPT). Kế hoạch thực hiện Khi thực hiện truy vấn này, thực sự phải mất một thời gian dài.

Nó làm tôi tự hỏi: Tại sao lại thế này? Là ước tính "chỉ" cách, hoặc các truy vấn từ xa trên các máy chủ được liên kết thực sự đắt tiền?


2
BTW: Đó là "số lần thực hiện ước tính" mà bạn nên xem xét để tìm kiếm chỉ mục. Số lượng hàng ước tính là đầu ra hàng cho mỗi lần thực hiện, điều này sẽ không liên quan đến số lượng hàng trong bảng trừ khi kế hoạch có quét toàn bộ.
Martin Smith

Câu trả lời:


9

Kế hoạch bạn có vào lúc này có vẻ như là kế hoạch tối ưu nhất với tôi.

Tôi không đồng ý với khẳng định trong các câu trả lời khác rằng nó đang gửi các hàng 2,6M đến máy chủ từ xa.

Kế hoạch đối với tôi như thể đối với mỗi trong số 54 hàng được trả về từ truy vấn từ xa, nó đang thực hiện một tìm kiếm chỉ mục vào bảng cục bộ của bạn để xác định xem nó có khớp hay không. Đây là khá nhiều kế hoạch tối ưu.

Thay thế bằng phép nối băm hoặc phép nối hợp nhất sẽ phản tác dụng với kích thước của bảng và thêm #tempbảng trung gian chỉ cần thêm một bước bổ sung dường như không mang lại cho bạn bất kỳ lợi thế nào.


6

Kết nối với một tài nguyên từ xa là tốn kém. Giai đoạn = Stage.

Một trong những hoạt động đắt nhất trong bất kỳ môi trường lập trình nào là IO mạng (mặc dù IO đĩa có xu hướng lùn nó).

Điều này mở rộng đến các máy chủ được liên kết từ xa. Máy chủ gọi máy chủ được liên kết từ xa trước tiên cần thiết lập kết nối, sau đó truy vấn cần được thực hiện trên máy chủ từ xa, kết quả được trả về và kết nối bị đóng. Tất cả điều này mất thời gian qua mạng.


Bạn cũng nên cấu trúc truy vấn của mình theo cách bạn chuyển dữ liệu tối thiểu qua dây. Đừng mong đợi DB sẽ tối ưu hóa cho bạn.

Nếu tôi viết truy vấn này, tôi sẽ chọn dữ liệu từ xa vào biến bảng (hoặc vào bảng tạm thời) và sau đó sử dụng kết hợp này với bảng cục bộ. Điều này đảm bảo rằng chỉ có dữ liệu cần được chuyển sẽ.

Truy vấn bạn đang chạy có thể dễ dàng gửi các hàng 2,6M đến máy chủ từ xa để xử lý EXCEPTmệnh đề.


Ok, do đó, nó có chi phí khởi động cao để thiết lập kết nối. Truy vấn cần phải được gửi, xử lý từ xa (không cần mạng cho mạng đó) và cuối cùng là kết quả được gửi lại và xử lý. Nhưng sẽ không mất vài phút để gửi dữ liệu qua kết nối mạng, phải không?
vstrien

@vstrien - Nó có thể. Phụ thuộc vào kết nối mạng, độ trễ, độ bão hòa và các yếu tố khác. Điểm đang tồn tại - nó không mang tính quyết định.

@vstrien - Đã thêm thông tin trong câu trả lời của tôi. Tôi tin rằng truy vấn dưới dạng văn bản sẽ gửi các hàng cục bộ đến máy chủ từ xa để xử lý.

2
Bạn suy luận thực tế rằng nó đang gửi các hàng 2,6M đến máy chủ từ xa từ đâu? Tôi chưa có nhiều kinh nghiệm với các kế hoạch với các toán tử truy vấn từ xa nhưng có vẻ như 54 hàng sắp ra khỏi toán tử truy vấn từ xa, sau đó nó đang thực hiện chống bán kết hợp với bảng cục bộ.
Martin Smith

2
@Lieven - Có thể hợp lý nhưng đừng nghĩ nó đúng từ kế hoạch được hiển thị.
Martin Smith

1

Tôi không phải là chuyên gia nhưng nếu bạn đang sử dụng Union, Ngoại trừ hoặc Intersect, bạn không phải sử dụng "Khác biệt". Tùy thuộc vào các giá trị từ LocalDb.schema. [Tên bảng], hiệu suất truy vấn có thể được cải thiện.

SELECT 
    identifier 
FROM LinkedServer.RemoteDb.schema.[TableName]

EXCEPT

SELECT 
    identifier 
FROM LocalDb.schema.[TableName]

0

Oded là đúng, vấn đề hiệu suất là do gửi các hàng 2,6M đến máy chủ từ xa của bạn.

Để khắc phục sự cố này, bạn có thể buộc dữ liệu từ xa (54 hàng) được gửi cho bạn bằng cách sử dụng tạm thời hoặc trong bảng bộ nhớ.

Sử dụng bảng tạm thời

SELECT  identifier 
INTO    #TableName
FROM    LinkedServer.RemoteDb.schema.[TableName]

SELECT  identifier
FROM    #TableName
EXCEPT
SELECT  DISTINCT identifier 
FROM    LocalDb.schema.[TableName] 

DROP    #TableName

Sử dụng bảng tạm thời có thể giúp ước tính số lượng thẻ trong mọi trường hợp mặc dù các vòng lặp lồng nhau có vẻ hợp lý chỉ với 54 hàng.
Martin Smith

Sử dụng bảng tạm thời hoạt động đúng với 54 hàng; nhưng trong trường hợp có bàn lớn ở cả hai phía thì không còn khả thi nữa. Giải pháp của bạn sẽ là gì đối với hai bảng "khổng lồ" có kích thước bằng nhau? Tạo một UserTable, trong cơ sở dữ liệu khác?
vstrien

1
@vstrien - thực sự không phải là một giải pháp tốt cho hai bàn lớn cỡ bằng nhau. Có lẽ việc tạo Chế độ xem phân tán được bạn quan tâm nhưng tôi không có kinh nghiệm gì với nó.
Lieven Keersmaekers

0

Tôi nghĩ rằng tốt hơn hết là sao chép bảng từ xa vào máy chủ mà bạn đang truy vấn và sau đó chạy tất cả SQL của bạn cục bộ.

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.