Tôi có một truy vấn có 7 tham gia bên trong (vì rất nhiều thông tin được phân phối trong các bảng khác), một vài đồng nghiệp đã rất ngạc nhiên. Tôi đã tự hỏi liệu họ có nên ngạc nhiên hay có 7 người tham gia bên trong bình thường không?Có bảy tham gia bên trong trong một truy vấn quá nhiều không?
Trả lời
nó không phải không nghe, nhưng tôi sẽ đặt nó vào một cái nhìn để dễ sử dụng và bảo trì
Đó là bình thường nếu schema của bạn là ở 5th normal form:)
Hai câu hỏi:
- Ứng dụng có hoạt động không?
- Bạn có thể giải thích nó không?
Nếu có, thì 7 thì tốt. Nếu bạn không thể giải thích các truy vấn, thì bảy là quá nhiều.
Tùy thuộc vào những gì bạn đang cố gắng hoàn thành, một số lượng lớn các kết nối trong truy vấn không đáng kể.
Cá nhân, tôi sẽ ít quan tâm đến số lượng kết nối được sử dụng để trả lại tập kết quả mong muốn và quan tâm hơn đến việc truy vấn được tối ưu hóa và chạy trong các tham số có thể chấp nhận.
Nếu truy vấn được tối ưu hóa hoàn toàn và không thể cắt bớt nhưng chính truy vấn không thực thi đủ nhanh thì có thể thiết kế cấu trúc dữ liệu không phù hợp với những gì bạn đang cố gắng thực hiện. Tại thời điểm đó bạn có thể đánh giá lại những gì bạn đang cố gắng hoàn thành hoặc cấu trúc của dữ liệu đang cung cấp mô hình kinh doanh của bạn.
Có thể không bình thường nhưng chắc chắn không quá lớn. Nếu bạn thấy mình tham gia cùng một bảng hơn và hơn, tạo ra một số quan điểm.
Nó không có gì bất thường. Với một hệ thống như Siebel, việc xem số lượng nhân vật tăng gấp đôi là rất phổ biến.
Bảy kết nối làm cho nó khó khăn hơn cho khả năng đọc, nhưng quan trọng hơn là hiệu suất và khả năng mở rộng. Nếu đó là OK, đi cho nó.
Số lượng tham gia phụ thuộc vào mô hình dữ liệu của bạn, 7 lần tham gia có thể có trong truy vấn của bạn nếu đó là những gì bạn truy vấn - tôi nhớ có các truy vấn tương tự trong ứng dụng tôi đã làm việc từ lâu. kích thước bảng, chỉ mục, tải máy chủ, cấu hình máy chủ đến tên ít) và tôi không nghĩ rằng nó có thể được tổng quát rằng 7 tham gia là xấu.
nếu nó làm việc cho bạn sau đó tôi đoán tốt của nó: D
Tôi nghĩ rằng những gì bạn muốn tránh là độ sâu tham gia lớn hơn 7. 7 bên tham gia ít hơn 7 tham gia sâu chắc chắn là không phải không nghe của, nhưng đôi khi mọi người nghe "7 tham gia" và nghĩ rằng không có không có 7 tham gia, không sâu.
Ý của bạn là "Độ sâu"? Tôi cho rằng đó là các phép nối song song, chứ không phải nối tiếp nối tiếp. – dkretz
7 là tốt nếu thiết kế cơ sở dữ liệu của bạn yêu cầu nó. Tuy nhiên, nếu 7 là cần thiết để đạt được mục tiêu của bạn, tôi sẽ xem xét lại thiết kế cơ sở dữ liệu để đảm bảo mức độ tối tăm này thực sự cần thiết.
Ngoài sự tò mò, đây có phải là DB2 không? Chỉ cần một mô hình tôi đã nhận thấy :)
Đóng, thông tin thực sự của nó – seFausto
là 7 tham gia bên trong này trên cùng một bảng, 7 kết nối bên trong trên các bảng khác nhau hoặc 7 lồng nhau kết nối bên trong?
... câu hỏi lừa! Nó thực sự không quan trọng, nếu đó là cấu trúc cơ sở dữ liệu của bạn yêu cầu, thì đúng là
báo trước: nếu nó là 7 kết nối bên trong lồng nhau trên cùng một bảng, bạn có thể có một bảng có cấu trúc kém ;-)
Vâng, điều đó là bình thường - nhưng, thực sự, nó không phải là một ý tưởng tuyệt vời từ góc độ hiệu suất. Kể từ khi kế hoạch truy vấn được xây dựng trên ước chi phí, có một increase in the number of errors khi bạn tăng tham gia (hoặc bất kỳ nhà điều hành khác, cho rằng vấn đề):
Các SQL Server Query Optimizer sẽ ước tính ít nhất một hàng sắp ra của một nhà điều hành tìm kiếm. Điều này được thực hiện để tránh trường hợp khi một cây con rất đắt tiền được chọn do đánh giá thấp thẻ. Nếu cây con được ước tính trả lại hàng bằng không, nhiều kế hoạch có giá giống nhau và có thể có lỗi trong kết quả lựa chọn gói. Vì vậy, bạn sẽ nhận thấy rằng ước tính là "cao" đối với trường hợp này và một số lỗi có thể xảy ra. Bạn cũng có thể nhận thấy rằng chúng tôi ước tính 20 lần thực thi nhánh này thay vì thực tế 10. Tuy nhiên, với số lượng các phép nối đã được đánh giá trước toán tử này, bị giảm bởi hệ số 2 (10 hàng) không được coi là quá tệ. (Lỗi có thể tăng theo cấp số nhân với số lượng tham gia).
Ngoài ra, trình tối ưu hóa cố gắng cân bằng thời gian cần thiết để lên kế hoạch so với mức tiết kiệm tiềm năng - nó sẽ không dành cả ngày cố gắng tìm kế hoạch tối ưu nhất. Việc tham gia càng nhiều, số lượng các kế hoạch thay thế càng lớn - một số trong đó có thể tối ưu hơn so với trình tối ưu hóa có thời gian để tìm.
Chắc chắn không phải bất thường. Tuy nhiên ít nhất trong Oracle, 7 là một số đặc biệt, như bất kỳ nhiều hơn thế và tối ưu hóa không còn có thể kiểm tra mọi thứ tự tham gia (do tăng trưởng giai thừa trong số khả năng). Vì vậy, nó sẽ là khôn ngoan để tránh đi qua 7 trừ khi bạn đang chuẩn bị để babysit kế hoạch thực hiện của bạn.
7 hoặc thậm chí nhiều hơn là không có gì bất thường trong kho dữ liệu trong đó bảng thực tế có thể dễ dàng có khóa ngoài tới hàng tá kích thước. Trong kịch bản kho dữ liệu, cardinality của các kích thước thường thấp so với bảng thực tế, do đó, các bộ lọc trên các tham số giúp bảng thực tế được sử dụng thông qua tìm kiếm hoặc quét chỉ mục. Đối với một lược đồ giao dịch chuẩn hóa, thường không phải là vấn đề nếu bản số của tập kết quả thấp trong bảng cơ sở chính (tức là chọn mọi thứ về một khách hàng), vì các khóa ngoại thường có thể dẫn đến chỉ mục tìm kiếm hoặc quét chỉ mục.
- 1. Tham gia truy vấn và khi quá nhiều
- 2. Truy vấn SQL cho Tham gia bên trong với Chọn
- 3. Chèn truy vấn với tham gia bên trong
- 4. Nhiều lần tham gia trong truy vấn Khung thực thể
- 5. LINQ truy vấn trong EF - nhiều nhiều và một chéo tham gia
- 6. Chọn khác biệt trên tham gia bên trong Truy vấn lọc theo nhiều giá trị trên một cột?
- 7. các truy vấn con vs tham gia
- 8. CursorLoader - Hai bảng tham gia truy vấn?
- 9. Tham gia bên trong bằng HQL
- 10. Tham gia bên trong có điều kiện
- 11. Quá nhiều lần tham gia bên ngoài trái trong khung Entity 4?
- 12. Tại sao mySQL truy vấn, trái tham gia 'đáng kể' nhanh hơn so với bên trong của tôi tham gia
- 13. Tham gia bên trong SQLite/JDBC
- 14. lượt rẽ trái tham gia vào bên trong tham gia
- 15. thứ tự của bảng trong tham gia truy vấn
- 16. Quá nhiều bảng; MySQL chỉ có thể sử dụng 61 bảng trong một tham gia
- 17. PHP/MySQL: Bắt nhiều cột có cùng tên trong truy vấn tham gia không có bí danh?
- 18. Tham gia truy vấn hoặc truy vấn phụ
- 19. Tham gia nhiều bảng trong SQL
- 20. Xóa bằng "Tham gia" trong Oracle sql Truy vấn
- 21. Cần trợ giúp về Đối diện với Tham gia bên trong Truy vấn bằng LINQ
- 22. Điều gì là tốt hơn? Truy vấn con hoặc tham gia bên trong mười bảng?
- 23. phức tạp tham gia truy vấn
- 24. Tham gia hai sql truy vấn
- 25. Giá trị cột lựa chọn bên ngoài trong truy vấn phụ đã tham gia?
- 26. Cách kết hợp tham gia bên trong và bên trái tham gia vào Khung thực thể
- 27. Tham gia hai truy vấn con trong MySQL
- 28. cách ngăn trùng lặp với truy vấn tham gia bên trong (Postgres)
- 29. Cú pháp truy vấn cập nhật SQL với tham gia bên trong
- 30. Học thuyết xây dựng truy vấn sử dụng bên trong tham gia với điều kiện
Tôi thích cơ sở dữ liệu chuẩn hóa rất nhiều, nhưng có một thời điểm khi tôi thích "Tôi cần một lượt xem. NGAY BÂY GIỜ". và sau đó đi và làm một. –
lượt xem cần phải chết cùng với các procs được lưu trữ. kích hoạt có thể ở lại mặc dù. – Shawn
@Shawn: Relvars ảo ("views") tạo điều kiện độc lập dữ liệu. Có rất ít tính năng của một DBMS hữu dụng hơn thế này. – Apocalisp