SQL Server INNER REMOTE THAM GIA trả về nhiều hàng hơn INNER THAM GIA


7

Tôi đang cố gắng tham gia một vài hàng từ chế độ xem từ xa đến bảng cục bộ. Chế độ xem có khoảng 300 triệu hàng, vì vậy tôi muốn sử dụng gợi ý truy vấn XÓA để tất cả 3 triệu hàng không phải chuyển vào máy tính của tôi.

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
    SELECT TOP 100 Something, L_ID FROM [RemoteServer].[RemoteDB].[dbo].[RemoteTable]
    ) R
ON L.ID = R.L_ID

Điều này trả về 100 hàng, như tôi mong đợi, và về cơ bản không mất thời gian, như tôi mong đợi.

Tuy nhiên,

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER REMOTE JOIN (
    SELECT TOP 100 Something, L_ID FROM [RemoteServer].[RemoteDB].[dbo].[RemoteTable]
    ) R
ON L.ID = R.L_ID

bắt đầu trả về hàng ngàn hàng. Tôi bỏ nó sau vài giây, nhưng nó đã ở mức hàng chục - hàng trăm ngàn.

Làm thế nào một gợi ý truy vấn có thể thay đổi tập kết quả của tôi?


1) Kích thước của bảng địa phương là gì? 1b) Bạn có chắc bạn đang ở đúng máy chủ? 2) Mối quan hệ như thế nào; 1-1, 1-nhiều, nhiều-nhiều? 3) Như đã chỉ ra trong một trong những câu trả lời, TOPkhông ORDER BYcó nghĩa là vô nghĩa, nhưng sẽ không tốt hơn nhiều nếu bạn nắm bắt được hàng n hàng đầu nếu chúng không thực sự nằm trong tập hợp mà bạn quan tâm - đâu là điểm để nắm lấy top 100 hàng ở đây? 4)
Đồng hồ-Muse

Câu trả lời:


18

TOP 100không có ORDER BYnghĩa là không xác định được 100 hàng từ bảng từ xa cuối cùng tham gia vào tham gia. Đây là kế hoạch thực hiện phụ thuộc và có thể thay đổi.

Nếu đó là mối quan hệ một đến nhiều thì có thể xảy ra trường hợp một lô 100 hàng có nhiều kết quả khớp ở phía bên kia của liên kết so với một lô 100 hàng khác.

Bạn nên chỉ định một ORDER BY(bên trong bảng dẫn xuất) trên một số cột duy nhất hoặc kết hợp các cột để đảm bảo kết quả xác định.


TOPkhông có một ORDER BYlà vô nghĩa, vâng, nhưng tôi sẽ xem xét TOPtrước điều kiện tham gia (những hàng có liên quan!?) dù sao cũng khá vô nghĩa. Bạn cần có thể có được các tiêu chí tìm kiếm tương tự bên trong, điều này có thể dẫn đến vi phạm chuẩn hóa.
Đồng hồ-Muse

@ Clockwork-Muse - Không hề. Hoàn toàn có thể muốn 100 hàng gần đây nhất từ ​​bảng từ xa ( TOP 100 ... FROM RemoteTable ORDER BY DateInserted DESC) và các chi tiết liên quan của chúng từ bảng cục bộ. ví dụ: không có gì vô nghĩa khi yêu cầu 100 tiêu đề đơn hàng mới nhất và chi tiết đơn hàng của họ. (Mặc dù điều này sẽ khó có thể được phân chia trên các máy chủ)
Martin Smith

1

Bạn có thể thử buộc truy vấn từ xa chạy từ xa:

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
        SELECT TOP 100 Something, L_ID 
        FROM OPENQUERY([RemoteServer], 'SELECT Something, L_ID
                                        FROM [RemoteDB].[dbo].[RemoteTable]'
                      )
               ) R
ON L.ID = R.L_ID

Hoặc (nếu bạn muốn bộ giới hạn 100 nằm trong truy vấn từ xa):

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
        SELECT Something, L_ID 
        FROM OPENQUERY([RemoteServer], 'SELECT TOP 100 Something, L_ID
                                        FROM [RemoteDB].[dbo].[RemoteTable]'
                      )
               ) R
ON L.ID = R.L_ID
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.