2009-07-21 32 views
5

Currenlty Tôi đang sử dụng rất nhiều bên trong tham gia (khoảng 7) trong sp của tôi, nó có bất kỳ tác động trên sp perfomance. không tham gia bên ngoài bên trái cho tốt hơn perfomance sau đó bên trong tham gia.Có vấn đề về ngoại lệ nào với Inner Join không?

một điều nữa nếu tôi tham gia hai bảng a và b trong đó có id cột và id1, cả hai đều không thể rỗng. tôi giả sử ở đây tôi có thể đi cho tham gia bên trong như các cột r lập chỉ mục.

+0

bạn có chỉ mục trên các cột được sử dụng cho điều kiện kết nối (cũng như bất kỳ cột nào được sử dụng cho điều kiện khác, như trong mệnh đề where) không? nó có thể * thực sự * giúp đỡ. Nói chung, tôi đã nghe nói bên trong là tốt hơn cho hiệu suất hơn trái - nhưng những gì nên được sử dụng phụ thuộc vào những gì bạn muốn nhận được ^^ –

Trả lời

0

Trước hết, hai mục đích này có nghĩa là để phục vụ cho mục đích khác nhau. Vì vậy, so sánh có thể không hợp lệ trong mọi trường hợp.

Bạn có thể đọc thêm tại đây.

Performance tuning SQL Server joins

10

Kết nối bên ngoài đắt hơn so với kết nối bên trong. Những gì tôi sắp nói sẽ gây nhiều tranh cãi cho nhiều người. Nếu bạn điều chỉnh cơ sở dữ liệu đúng và nếu bạn không làm bất cứ điều gì ngốc nghếch và nếu bạn đang sử dụng một sức mạnh chuyên nghiệp RDBMS, sau đó 7 bên trong tham gia không phải là một vấn đề.

Tôi có ý nghĩa gì khi điều chỉnh cơ sở dữ liệu? Có rất nhiều điều chỉnh cơ sở dữ liệu nhưng điều rõ ràng nhất để kiểm tra là đảm bảo rằng bạn luôn tham gia trên các cột được lập chỉ mục.

Tôi có ý gì khi ngốc nghếch? Không sử dụng toán tử OR trong điều kiện kết nối của bạn. Cố gắng giữ cho sự tham gia của bạn qua một so sánh đơn như một khoá ngoại trong một bảng bằng khóa chính trong bảng khác. Cố gắng giữ tất cả các trường chính của bạn được nhập là số nguyên.

Nếu bạn gặp sự cố về hiệu suất, hãy đảm bảo nghiên cứu kế hoạch thực hiện của truy vấn vi phạm. Ví dụ: bạn có thể gặp sự cố khi tham gia trên các bảng thực sự lớn, quá lớn đến nỗi việc quét chỉ mục quá chậm. Bạn có thể phải không chuẩn hóa và cung cấp thêm tính năng lọc để giảm thời gian quét. Đừng cố gắng đoán trước điều này. Không chuẩn hóa được thực hiện tốt nhất một cách hiếm hoi và chỉ sau khi bạn chạy vào tình huống thực tế của thế giới thực.

+0

Trường hợp là phần gây tranh cãi, một lần nữa? Số lượng tham gia? Tôi nghĩ rằng nó chỉ phụ thuộc vào những gì bảng đang được tham gia. Ngoài ra, lời khuyên tốt về các mệnh đề 'OR'. Chúng đắt tiền, đặc biệt là trong SQL Server. – Eric

+0

Tôi đã làm việc với các nhà phát triển trong quá khứ, những người tin rằng bạn không nên vượt quá ba lần tham gia vì lý do hiệu suất. Tôi đã đồng ý với điều đó vào những năm 1980 nhưng không phải hôm nay. – Glenn

3

JOIN được sử dụng cho một mục đích cụ thể & không cho hiệu suất.

LEFT OUTER JOIN được sử dụng để bao gồm các bản ghi, không có bản ghi phù hợp trong bảng ở bên phải. INNER JOIN chọn các bản ghi phù hợp dựa trên một số tiêu chí, trong cả hai bảng.

+0

Tidbit nhỏ này về LEFT OUTER JOIN là siêu hữu ích cho tôi. Việc chuyển sang một OUTER JOIN từ INNER JOIN đã cắt truy vấn của tôi từ 16 giây xuống 50 ms. Tôi đã không tìm kiếm trên bất kỳ cột của bảng đã tham gia để nó có thể được tham gia sau khi thực tế. –

0

Để theo dõi những gì Glenn said, nếu bạn đang tham gia vào "công cụ ngốc nghếch" thì việc trích xuất ra bảng tạm thời cũng có thể hữu ích.

Trong một cơ sở dữ liệu tôi đã làm việc trong quá khứ, kết nối là một phần khóa (bảng có khóa tổng hợp, tức là khóa chính có nhiều cột trong đó) và có thêm lọc đang diễn ra trong mệnh đề where. Việc lọc trong mệnh đề where lấy tập hợp các hàng được xem từ vài tỷ đến vài nghìn ở một bên của phép nối. Tham gia vào một bảng của hàng ngàn hàng đã dễ dàng hơn nhiều so với vài tỷ. Thời gian truy vấn đã giảm từ 20 phút xuống còn 7 giây khi tôi nhớ lại.

Cũng lưu ý, chúng tôi cũng có các truy vấn phụ và UDF (các hàm do người dùng xác định) - có thể được thêm vào goofiness.

1

Kết nối trái cho kết quả khác so với kết nối bên trong và do đó không nên được sử dụng để thay thế. Nhiều khả năng nó là lập chỉ mục mà bạn cần. Mặc dù chỉ mục được tạo tự động khi bạn xác định khóa chính, nhưng chúng không được tạo khi bạn xác định khóa ngoại. Vì vậy, bạn sẽ cần phải lập chỉ mục tất cả các khóa foregin đó trong các phép nối của bạn nếu bạn chưa có.

Ngoài ra, hãy kiểm tra kế hoạch thực hiện của bạn để xem vấn đề ở đâu.

Để được tư vấn cụ thể hơn về các cách điều chỉnh hiệu suất truy vấn của bạn, bạn cần hiển thị cho chúng tôi.

0

Lý do tại sao các kết nối thường đắt tiền là việc tham gia có thể dẫn đến một số bộ dữ liệu lớn hơn kích thước của một trong hai bảng.

Tuy nhiên, đôi khi các thuộc tính nối trong một bảng có chức năng xác định một bộ dữ liệu duy nhất trong một bảng khác. trong trường hợp này, tham gia có thể rất rẻ (nhưng bạn sẽ cần phải lập chỉ mục trên các thuộc tính đó).

Đây sẽ là một hoạt động giá rẻ bất kể số lần tham gia bạn đã làm - đó là vấn đề về dữ liệu và dữ liệu phụ thuộc nhiều hơn.

Vì bạn đang tham gia trên 2 khóa, có vẻ như cùng một khóa được sử dụng cho cả hai bảng, đây là một hoạt động giá rẻ bất kể bạn tham gia loại gì.

Các vấn đề liên quan