Tham gia bảng trong hai cơ sở dữ liệu làm cho truy vấn chậm? phân vùng db có tốt hơn không?


9

Tôi có một table1trong db1table2db2trên SQL Server 2008 R2.

Nếu tôi thực hiện một truy vấn chọn tham gia cả hai bảng, sẽ rất chậm để có kết quả.

Một truy vấn đơn giản như

SELECT * 
FROM db1.dbo.table1 t1 
LEFT JOIN db2.dbo.table2 t2 ON t1.k1 = t2.k2

đôi khi thực sự chậm.

Tôi không chắc chắn nếu điều này là phổ biến đối với SQL Server và "phải giống như một quy tắc" để "không tham gia hai bảng từ các cơ sở dữ liệu khác nhau".

Trong trường hợp đó ... Tôi thêm vào câu hỏi này rằng tôi có một trong những dữ liệu nhị phân db được lưu trữ trên một trường và tôi muốn tách khỏi db chính để không tăng kích thước bảng chính ... tốt hơn là phân vùng db cho điều này ?

Tôi đã thử nghiệm với hai bảng đơn giản và vẫn tham gia hai bảng đó là chậm.

Cảm ơn trước sự giúp đỡ nào.

.. Cập nhật một số năm sau ... 24-09-18

hãy chắc chắn rằng các trường mà bạn đang tham gia có cùng loại, kích thước và đối chiếu.

Ví dụ: một số thuộc tính là varchar (255) và một varchar khác (20) ... đó có thể là một vấn đề vì động cơ phải truyền loại này sang loại khác (một chuyển đổi ngầm xảy ra) và trong khi đôi khi nó chạy nhanh hơn ... nếu a reindex hoặc một số thay đổi trong db xảy ra, bạn có thể thấy rằng trong một lúc nào đó, truy vấn bắt đầu mất nhiều thời gian hơn để hoàn thành ....

Nếu bạn không thể thay đổi loại trường để khớp với một trong các bảng db /, hãy thử thực hiện một biểu mẫu rõ ràng để xem điều đó có cải thiện tốc độ truy vấn không. sử dụng cast(fieldname as type(size)) = fieldName2)


Bạn có chỉ mục trên các trường THAM GIA không?
Mihai

5
Nếu hai bảng nằm trên các cơ sở dữ liệu khác nhau nhưng trong cùng một trường hợp, nó sẽ không ảnh hưởng đáng kể đến hiệu suất. Chỉ có một chi phí cho quyền ckeck trên cơ sở dữ liệu. Các lý do chính cho các vấn đề hiệu suất thường là thiếu chỉ mục và / hoặc khóa / chặn.
Lmu92

1
Bạn có thể giải thích tại sao bạn cần 2 cơ sở dữ liệu và không có tất cả dữ liệu trong một không?
ypercubeᵀᴹ

1
bạn có thể gửi kế hoạch thực hiện thực tế của bạn?
Lmu92

1
@FabianSilva: Không có lời giải thích nào cả. Vui lòng cung cấp một mô tả tốt hơn về các yêu cầu kinh doanh của anh ấy đòi hỏi phải có cơ sở dữ liệu riêng biệt.
Pieter Geerkens

Câu trả lời:


23

Bạn đã có một loạt các câu hỏi khác nhau ở đây, vì vậy hãy giải quyết chúng một cách riêng lẻ.

H: Nếu tôi tham gia hai bảng trong cùng một cơ sở dữ liệu với truy vấn trên, tại sao nó chậm?

Trả lời: Đối với người mới bắt đầu, bạn không sử dụng mệnh đề WHERE, vì vậy SQL Server phải xây dựng tập kết quả hoàn chỉnh, hợp nhất cả hai bảng lại với nhau. Nếu bạn chỉ cần một tập hợp con của dữ liệu, hãy xem xét sử dụng mệnh đề WHERE để chỉ lấy dữ liệu bạn cần.

Khi bạn đã hoàn thành việc đó, hãy lưu ý rằng bạn đang sử dụng TRÁI PHIẾU TRỞ NÊN. Điều này nói với SQL Server, "Không phải tất cả các bản ghi bảng1 sẽ có các bản ghi khớp trong bảng2." Điều đó hoàn toàn tốt nếu đó là sự thật - nhưng nếu bạn biết tất cả các bản ghi t1 sẽ có ít nhất một bản ghi t2, thay vào đó hãy sử dụng INNER THAM GIA.

Tiếp theo, lập chỉ mục bắt đầu phát huy tác dụng - tùy thuộc vào độ rộng của các bảng và số lượng trường, bạn có thể muốn thêm chỉ mục vào các trường bạn đang sử dụng để tham gia. Để có được lời khuyên tốt về điều đó, tốt nhất bạn nên đăng kế hoạch thực hiện thực tế mà bạn đang làm việc.

H: Nếu tôi các bảng nằm trong các cơ sở dữ liệu khác nhau trên cùng một Máy chủ SQL, điều đó có thay đổi gì không?

Trả lời: Không. Có một số vấn đề thú vị xung quanh những thứ như mức cô lập mặc định trong các cơ sở dữ liệu khác nhau, nhưng đối với hầu hết các phần, các truy vấn của bạn sẽ tạo ra cùng một kế hoạch và tốc độ thực hiện.

Q: Tôi có nên sử dụng phân vùng bảng để thực hiện việc này nhanh hơn không?

Trả lời: Bạn đã đề cập đến phân vùng cơ sở dữ liệu, nhưng không có điều gì như vậy trong SQL Server - Tôi đoán bạn có nghĩa là phân vùng bảng. Nói chung, không, tôi sẽ không chuyển sang thay đổi thiết kế cơ sở dữ liệu để làm cho việc tham gia diễn ra nhanh hơn. Bắt đầu với những điều cơ bản - hiểu các kế hoạch thực hiện SQL Server - và chỉ thực hiện thay đổi thiết kế cơ sở dữ liệu để giải quyết các vấn đề mà bạn không thể khắc phục bằng những thứ như chỉ mục.


11
Ngoài ra, đặc biệt nếu bạn không cần tất cả các cột (và ít nhất là cột tham gia là dự phòng), hãy ngừng sử dụngSELECT * .
Aaron Bertrand

cảm ơn @AaronBertrand Trước đây tôi có "Chọn *" trên chế độ xem và khi thay đổi một trong các bảng sử dụng chế độ xem, "chọn *" đã truy xuất các cột bảng bị lỗi và phải thay đổi bảng và lưu lại để hoạt động. nói chung select * thực sự là một con quái vật không phải tồn tại, tôi chỉ đặt "select *" làm ví dụ chung về việc nối hai bảng trên hai dbs .. không nhiều hơn thế.
FabianSilva

@FabianSilva Vâng, tôi nói về chính xác kịch bản đó trong bài tôi đã liên kết .
Aaron Bertrand

câu trả lời thứ 2 là những gì tôi cần biết, không chắc tại sao trong trường hợp THAT lại chậm tham gia vào các dbs đó ... nhưng ít nhất tôi có thể biết rằng tôi đã không làm gì đó sai khi tham gia các bảng trên db khác nhau của cùng một máy chủ.
FabianSilva
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.