THAM GIA truy vấn so với nhiều truy vấn


180

Là các truy vấn THAM GIA nhanh hơn một số truy vấn? (Bạn chạy truy vấn chính của mình và sau đó bạn chạy nhiều CHỌN khác dựa trên kết quả từ truy vấn chính của bạn)

Tôi đang hỏi bởi vì THAM GIA họ sẽ làm phức tạp RẤT NHIỀU thiết kế ứng dụng của tôi

Nếu chúng nhanh hơn, bất cứ ai cũng có thể ước chừng rất nhiều khoảng bao nhiêu? Nếu đó là 1,5 lần thì tôi không quan tâm, nhưng nếu là 10 lần thì tôi đoán là có.


Tôi cho rằng họ sẽ nhanh hơn. Tôi biết rằng một INSERT so với nói 10 truy vấn INSERT riêng lẻ nhanh hơn nhiều.
alex

1
Điều quan trọng là liệu nhiều truy vấn của bạn có nằm trong một quy trình được lưu trữ hay không nếu chúng bắt nguồn từ ứng dụng (chỉnh sửa câu hỏi của bạn với thông tin này). Cái trước sẽ nhanh hơn nhiều so với cái sau.
colithium

Câu trả lời:


82

Đây là cách quá mơ hồ để cung cấp cho bạn một câu trả lời liên quan đến trường hợp cụ thể của bạn. Nó phụ thuộc vào rất nhiều thứ. Jeff Atwood (người sáng lập trang web này) thực sự đã viết về điều này . Tuy nhiên, đối với hầu hết các phần, nếu bạn có các chỉ mục phù hợp và bạn thực hiện THAM GIA đúng cách thì thường sẽ nhanh hơn để thực hiện 1 chuyến đi so với nhiều chuyến đi.


2
nếu bạn đang tham gia 3 bảng trở lên trên các khóa khác nhau, thường thì cơ sở dữ liệu (ví dụ: mysql) chỉ có thể sử dụng một chỉ mục trên mỗi bảng, có nghĩa là một trong số các phép nối sẽ nhanh (và sử dụng một chỉ mục) trong khi các bảng khác sẽ cực kỳ chậm. Đối với nhiều truy vấn, bạn có thể tối ưu hóa các chỉ mục để sử dụng cho mỗi truy vấn.
dùng151975

4
Tôi nghĩ rằng điều này phụ thuộc vào định nghĩa của bạn về "nhanh hơn" ... ví dụ: 3 tham gia PK bên trong có thể quay vòng nhanh hơn 4 chuyến khứ hồi, vì chi phí mạng và vì bạn cần dừng và chuẩn bị và gửi từng truy vấn sau truy vấn trước hoàn thành. Tuy nhiên, nếu bạn định chuẩn một máy chủ đang tải, trong hầu hết các trường hợp, các phép nối sẽ mất nhiều thời gian CPU hơn so với truy vấn PK và thường gây ra nhiều chi phí mạng hơn.
mindplay.dk

97

Đối với các phép nối bên trong, một truy vấn duy nhất có ý nghĩa, vì bạn chỉ nhận được các hàng khớp. Đối với các phép nối trái, nhiều truy vấn sẽ tốt hơn nhiều ... hãy nhìn vào điểm chuẩn sau đây tôi đã làm:

  1. Truy vấn đơn với 5 lần tham gia

    truy vấn: 8.074508 giây

    kích thước kết quả: 2268000

  2. 5 truy vấn liên tiếp

    thời gian truy vấn kết hợp: 0,00262 giây

    kích thước kết quả: 165 (6 + 50 + 7 + 12 + 90)

.

Lưu ý rằng chúng tôi nhận được kết quả giống nhau trong cả hai trường hợp (6 x 50 x 7 x 12 x 90 = 2268000)

tham gia bên trái sử dụng bộ nhớ nhiều hơn theo cấp số nhân với dữ liệu dư thừa.

Giới hạn bộ nhớ có thể không tệ nếu bạn chỉ thực hiện nối hai bảng, nhưng nhìn chung là ba hoặc nhiều hơn và nó trở thành giá trị của các truy vấn khác nhau.

Một lưu ý phụ, máy chủ MySQL của tôi ở ngay bên cạnh máy chủ ứng dụng của tôi ... vì vậy thời gian kết nối là không đáng kể. Nếu thời gian kết nối của bạn là trong vài giây, thì có lẽ có một lợi ích

Frank


31
Nếu chúng ta bỏ qua một thực tế nhỏ khó chịu rằng không ai trong tâm trí của họ sẽ tham gia chéo giữa 5 bảng (vì lý do đó, cùng với đó trong hầu hết các trường hợp, điều đó không có ý nghĩa gì ), "điểm chuẩn" của bạn có thể có một số giá trị . Nhưng trái hoặc bên tham gia là các chỉ tiêu, thường là bằng phím (làm hồi nhanh hơn nhiều), và trùng lặp dữ liệu thường là nhiều, nhiều hơn bạn đang làm cho nó ra được.
cHao

12
@cHao nói ai? Tôi vừa tra SMF và phpBB và thấy THAM GIA giữa 3 bảng - nếu bạn thêm plugin hoặc sửa đổi, họ có thể dễ dàng thêm vào đó. Bất kỳ loại ứng dụng lớn nào cũng có tiềm năng cho nhiều THAM GIA. Có thể cho rằng một ORM được viết / sử dụng sai có thể THAM GIA các bảng mà nó không thực sự cần (thậm chí có thể là mọi bảng).
Natalie Adams

5
@NathanAdams: Tham gia bên trái và bên trong không tệ chút nào. (Trên thực tế, nếu bạn không tham gia các bảng ở đây và đó, thì bạn đang làm sai SQL.) Điều tôi đang nói là tham gia chéo , hầu như luôn luôn không mong muốn ngay cả giữa hai bảng, chứ đừng nói đến 5 - và sẽ là cách duy nhất để có được kết quả "2268000" không có thật khác được đề cập ở trên.
cHao

2
Nhìn vào kết quả, mặc dù. "kích thước kết quả: 2268000" so với "kích thước kết quả: 165". Tôi nghĩ rằng sự chậm chạp của bạn với THAM GIA là vì hồ sơ của bạn có mối quan hệ một-nhiều với nhau, trong khi nếu họ có mối quan hệ một đối một, thì THAM GIA sẽ hoàn toàn nhanh hơn và chắc chắn sẽ không có kết quả kích thước lớn hơn CHỌN.
Hold OfferHunger 22/03/2016

3
@cHao Rõ ràng là bạn chưa gặp Magento tại thời điểm nhận xét đầu tiên của bạn
vitoriodachef

26

Câu hỏi này đã cũ, nhưng thiếu một số điểm chuẩn. Tôi đã điểm chuẩn THAM GIA với 2 đối thủ của mình:

  • Truy vấn N + 1
  • 2 truy vấn, truy vấn thứ hai sử dụng một WHERE IN(...)hoặc tương đương

Kết quả rất rõ ràng: trên MySQL, JOINnhiều nhanh hơn. Các truy vấn N + 1 có thể làm giảm hiệu năng của ứng dụng một cách quyết liệt:

THAM GIA vs WHERE IN vs N + 1

Đó là, trừ khi bạn chọn rất nhiều hồ sơ chỉ ra một số lượng rất nhỏ các hồ sơ nước ngoài riêng biệt. Đây là một điểm chuẩn cho trường hợp cực đoan:

THAM GIA vs N + 1 - tất cả các hồ sơ chỉ vào cùng một hồ sơ nước ngoài

Điều này rất khó xảy ra trong một ứng dụng thông thường, trừ khi bạn đang tham gia một mối quan hệ nhiều-nhiều, trong trường hợp đó, khóa ngoại nằm ở bảng khác và bạn đang sao chép dữ liệu bảng chính nhiều lần.

Lấy đi:

  • Đối với các mối quan hệ * -to-one, luôn luôn sử dụng JOIN
  • Đối với các mối quan hệ * -to-many, truy vấn thứ hai thể nhanh hơn

Xem bài viết của tôi trên Medium để biết thêm thông tin.


22

Tôi thực sự đã đến câu hỏi này để tìm kiếm câu trả lời cho chính mình và sau khi đọc các câu trả lời tôi chỉ có thể đồng ý rằng cách tốt nhất để so sánh hiệu suất của các truy vấn DB là lấy các số trong thế giới thực bởi vì có nhiều biến được tính đến NHƯNG, tôi cũng nghĩ rằng việc so sánh các con số giữa chúng dẫn đến không tốt trong hầu hết các trường hợp. Ý tôi là những con số phải luôn được so sánh với một con số chấp nhận được và chắc chắn không được so sánh với nhau.

Tôi có thể hiểu nếu một cách truy vấn mất 0,02 giây và cách khác là 20 giây, đó là một sự khác biệt rất lớn. Nhưng điều gì sẽ xảy ra nếu một cách truy vấn mất 0,000000002 giây và cách khác để mất 0,0000002 giây? Trong cả hai trường hợp, một cách là nhanh hơn 1000 lần so với cách khác, nhưng nó có thực sự vẫn "khổng lồ" trong trường hợp thứ hai không?

Điểm mấu chốt như cá nhân tôi thấy nó: nếu nó hoạt động tốt, hãy tìm giải pháp dễ dàng.


4
Điều đó, tất nhiên, tùy thuộc vào việc bạn có kế hoạch mở rộng hay không. Vì khi facebook bắt đầu, tôi chắc chắn họ có những loại truy vấn đó, nhưng đã cân nhắc và tìm kiếm giải pháp hiệu quả hơn mặc dù có thể phức tạp hơn.
dudewad

@dudewad Làm cho ý nghĩa. Tất cả phụ thuộc vào những gì bạn cần, cuối cùng.
Valentin Flachsel

4
Haha vâng ... bởi vì tại google mất 1 nano giây có nghĩa đen tương đương với 10 tỷ nghìn tỷ đô la ... nhưng đó chỉ là tin đồn.
dudewad

2
@dudewad Thật ra, khi Facebook bắt đầu, tôi đảm bảo họ đã đi với giải pháp đơn giản hơn. Zuckerberg cho biết anh đã lập trình phiên bản đầu tiên chỉ sau 2 tuần. Khởi nghiệp cần phải tiến nhanh để cạnh tranh và những người sống sót thường không lo lắng về việc mở rộng quy mô cho đến khi họ thực sự cần nó. Sau đó, họ tái cấu trúc công cụ sau khi họ có hàng triệu đô la đầu tư và có thể thuê các lập trình viên rockstar chuyên về hiệu suất. Theo quan điểm của bạn, tôi hy vọng Facebook thường tìm giải pháp phức tạp hơn để tăng hiệu suất tối thiểu ngay bây giờ, nhưng sau đó hầu hết chúng ta không lập trình Facebook.
dallin

15

Đã kiểm tra nhanh chọn một hàng từ bảng 50.000 hàng và nối với một hàng từ bảng 100.000 hàng. Về cơ bản trông giống như:

$id = mt_rand(1, 50000);
$row = $db->fetchOne("SELECT * FROM table1 WHERE id = " . $id);
$row = $db->fetchOne("SELECT * FROM table2 WHERE other_id = " . $row['other_id']);

đấu với

$id = mt_rand(1, 50000);
$db->fetchOne("SELECT table1.*, table2.*
    FROM table1
    LEFT JOIN table1.other_id = table2.other_id
    WHERE table1.id = " . $id);

Phương pháp chọn hai mất 3,7 giây cho 50.000 lần đọc trong khi THAM GIA mất 2,0 giây trên máy tính chậm tại nhà của tôi. INNER THAM GIA và LEFT THAM GIA không tạo ra sự khác biệt. Tìm nạp nhiều hàng (ví dụ: sử dụng IN SET) mang lại kết quả tương tự.


1
Có thể sự khác biệt có thể thay đổi nếu chọn một trang của các hàng (như 20 hoặc 50) như đối với lưới xem web thông thường và so sánh TRÁI TRÁI đơn lẻ với hai truy vấn - chọn 2 hoặc 3 số nhận dạng với một số tiêu chí WHERE rồi chạy khác Truy vấn CHỌN với IN ().
JustAMartin

Các cột id và other_id được lập chỉ mục?
Aarish Ramesh

11

Câu hỏi thực sự là: Những hồ sơ này có mối quan hệ một đối một hay mối quan hệ một -nhiều ?

Trả lời TLDR:

Nếu một đối một, sử dụng một JOINtuyên bố.

Nếu một-nhiều, sử dụng một (hoặc nhiều) SELECTcâu lệnh với tối ưu hóa mã phía máy chủ.

Tại sao và làm thế nào để sử dụng CHỌN để tối ưu hóa

SELECT'ing (với nhiều truy vấn thay vì tham gia) trên một nhóm lớn các bản ghi dựa trên mối quan hệ một-nhiều tạo ra hiệu quả tối ưu, vì JOIN' ing có vấn đề rò rỉ bộ nhớ theo cấp số nhân. Lấy tất cả dữ liệu, sau đó sử dụng ngôn ngữ kịch bản phía máy chủ để sắp xếp nó:

SELECT * FROM Address WHERE Personid IN(1,2,3);

Các kết quả:

Address.id : 1            // First person and their address
Address.Personid : 1
Address.City : "Boston"

Address.id : 2            // First person's second address
Address.Personid : 1
Address.City : "New York"

Address.id : 3            // Second person's address
Address.Personid : 2
Address.City : "Barcelona"

Ở đây, tôi nhận được tất cả các hồ sơ, trong một tuyên bố chọn. Điều này tốt hơn là JOIN, sẽ lấy một nhóm nhỏ các bản ghi này, từng bản một, làm thành phần phụ của một truy vấn khác. Sau đó, tôi phân tích nó bằng mã phía máy chủ trông giống như ...

<?php
    foreach($addresses as $address) {
         $persons[$address['Personid']]->Address[] = $address;
    }
?>

Khi không sử dụng THAM GIA để tối ưu hóa

JOIN'một nhóm lớn các bản ghi dựa trên mối quan hệ một đối một với một bản ghi duy nhất tạo ra hiệu quả tối ưu so với nhiều SELECTcâu lệnh, lần lượt từng câu lệnh, chỉ đơn giản là có được loại bản ghi tiếp theo.

Nhưng JOINkhông hiệu quả khi nhận hồ sơ với mối quan hệ một-nhiều.

Ví dụ: Blog cơ sở dữ liệu có 3 bảng quan tâm, Blogpost, Tag và Comment.

SELECT * from BlogPost
LEFT JOIN Tag ON Tag.BlogPostid = BlogPost.id
LEFT JOIN Comment ON Comment.BlogPostid = BlogPost.id;

Nếu có 1 blogpost, 2 thẻ và 2 bình luận, bạn sẽ nhận được kết quả như sau:

Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag2, comment1,
Row4: tag2, comment2,

Lưu ý cách mỗi bản ghi được nhân đôi. Được rồi, vì vậy, 2 bình luận và 2 thẻ là 4 hàng. Nếu chúng ta có 4 bình luận và 4 thẻ thì sao? Bạn không nhận được 8 hàng - bạn nhận được 16 hàng:

Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag1, comment3,
Row4: tag1, comment4,
Row5: tag2, comment1,
Row6: tag2, comment2,
Row7: tag2, comment3,
Row8: tag2, comment4,
Row9: tag3, comment1,
Row10: tag3, comment2,
Row11: tag3, comment3,
Row12: tag3, comment4,
Row13: tag4, comment1,
Row14: tag4, comment2,
Row15: tag4, comment3,
Row16: tag4, comment4,

Thêm nhiều bảng hơn, nhiều bản ghi hơn, v.v., và vấn đề sẽ nhanh chóng tăng lên hàng trăm hàng chứa đầy đủ dữ liệu chủ yếu .

Những gì trùng lặp chi phí bạn? Bộ nhớ (trong máy chủ SQL và mã cố gắng loại bỏ các bản sao) và tài nguyên mạng (giữa máy chủ SQL và máy chủ mã của bạn).

Nguồn: https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html ; https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html


Bạn bỏ lỡ điểm. Nó không phải là về một (một | nhiều). Đó là về việc các bộ hàng có ý nghĩa được ghép nối với nhau hay không. Bạn đang yêu cầu hai bộ dữ liệu liên quan duy nhất. Nếu bạn đang yêu cầu bình luận và, giả sử, thông tin liên hệ của tác giả của họ, điều đó có ý nghĩa hơn khi tham gia, mặc dù mọi người có thể viết nhiều hơn một bình luận.
cHao

@cHao: Cảm ơn bình luận của bạn. Câu trả lời của tôi ở trên là tóm tắt Tài liệu MySQL được tìm thấy ở đây: dev.mysql.com/doc/workbench/en/wb-relationship-tools.html
Hold OfferHunger

Đó không phải là tài liệu MySQL. Đó là tài liệu cho một công cụ GUI cụ thể để làm việc với cơ sở dữ liệu MySQL. Và nó không cung cấp bất kỳ hướng dẫn nào khi tham gia (hoặc không) phù hợp.
cHao

@cHao: Xin lỗi, ý tôi là tài liệu MySQL (R) cho MySQL WorkBench (TM), không phải MySQL Server (TM).
Hold OfferHunger

Pedantry sang một bên, sự liên quan không rõ ràng. Cả hai đều đề cập đến mối quan hệ một-một và một-nhiều, nhưng đó là nơi phổ biến kết thúc. Dù bằng cách nào, vấn đề là về mối quan hệ giữa các bộ dữ liệu. Tham gia hai bộ không liên quan, bạn sẽ nhận được mọi sự kết hợp của cả hai. Chia dữ liệu liên quan thành nhiều lựa chọn và bây giờ bạn đã thực hiện nhiều truy vấn vì lợi ích không rõ ràng và bắt đầu thực hiện công việc của MySQL cho nó.
cHao

8

Xây dựng cả hai truy vấn và tham gia riêng biệt, sau đó thời gian mỗi truy vấn - không có gì giúp nhiều hơn các số trong thế giới thực.

Sau đó, thậm chí tốt hơn - thêm "GIẢI THÍCH" vào đầu mỗi truy vấn. Điều này sẽ cho bạn biết có bao nhiêu truy vấn mà MySQL đang sử dụng để trả lời yêu cầu dữ liệu của bạn và có bao nhiêu hàng được quét cho mỗi truy vấn.


7

Tùy thuộc vào độ phức tạp của cơ sở dữ liệu so với độ phức tạp của nhà phát triển, có thể đơn giản hơn để thực hiện nhiều cuộc gọi CHỌN.

Hãy thử chạy một số thống kê cơ sở dữ liệu dựa trên cả THAM GIA và nhiều CHỌN. Xem trong môi trường của bạn THAM GIA nhanh hơn / chậm hơn CHỌN.

Sau đó, một lần nữa, nếu thay đổi nó thành THAM GIA có nghĩa là thêm một ngày / tuần / tháng làm việc của nhà phát triển, tôi sẽ gắn bó với nhiều CHỌN

Chúc mừng

BLT


5

Theo kinh nghiệm của tôi, tôi đã thấy việc chạy một số truy vấn thường nhanh hơn, đặc biệt là khi truy xuất các tập dữ liệu lớn.

Khi tương tác với cơ sở dữ liệu từ một ứng dụng khác, chẳng hạn như PHP, có nhiều đối số của một chuyến đi đến máy chủ qua nhiều máy chủ.

Có nhiều cách khác để hạn chế số chuyến đi đến máy chủ và vẫn chạy nhiều truy vấn thường không chỉ nhanh hơn mà còn giúp ứng dụng dễ đọc hơn - ví dụ mysqli_multi_query.

Tôi không phải là người mới khi nói đến SQL, tôi nghĩ rằng có xu hướng các nhà phát triển, đặc biệt là các đàn em dành nhiều thời gian để cố gắng viết các phép nối rất thông minh vì chúng trông thông minh, trong khi thực sự có những cách thông minh để trích xuất dữ liệu đơn giản.

Đoạn cuối là một ý kiến ​​cá nhân, nhưng tôi hy vọng điều này sẽ giúp. Tôi đồng ý với những người khác mặc dù những người nói bạn nên điểm chuẩn. Không phải cách tiếp cận là một viên đạn bạc.


Có, chúng ta cũng không chỉ nên tự mình truy vấn mà còn xử lý dữ liệu bên trong ứng dụng. Nếu tìm nạp dữ liệu với các phép nối ngoài, có một số dư thừa (đôi khi nó có thể rất lớn) phải được sắp xếp bởi ứng dụng (thường là trong một thư viện ORM), do đó, tóm lại, một truy vấn CHỌN với truy vấn THAM GIA có thể tiêu tốn nhiều CPU hơn và thời gian hơn hai CHỌN đơn giản
JustAMartin

4

Việc bạn có nên sử dụng tham gia hay không là điều đầu tiên và quan trọng nhất về việc tham gia có hợp lý hay không . Chỉ tại thời điểm đó là hiệu suất thậm chí một cái gì đó được xem xét, vì gần như tất cả các trường hợp khác sẽ dẫn đến tồi tệ hơn đáng kể hiệu suất .

Sự khác biệt về hiệu suất sẽ chủ yếu gắn liền với mức độ liên quan của thông tin bạn truy vấn. Tham gia hoạt động và chúng rất nhanh khi dữ liệu có liên quan và bạn lập chỉ mục chính xác, nhưng chúng thường dẫn đến một số dư thừa và đôi khi nhiều kết quả hơn mức cần thiết. Và nếu các tập dữ liệu của bạn không liên quan trực tiếp, việc gắn chúng vào một truy vấn sẽ dẫn đến kết quả được gọi là sản phẩm của Cartesian (về cơ bản, tất cả các kết hợp hàng có thể có), gần như không bao giờ bạn muốn.

Điều này thường được gây ra bởi các mối quan hệ nhiều-một-nhiều. Ví dụ: câu trả lời của HoldPackHunger đã đề cập đến một truy vấn duy nhất cho bài viết, thẻ và nhận xét. Nhận xét có liên quan đến một bài đăng, cũng như các thẻ ... nhưng các thẻ không liên quan đến các bình luận.

+------------+     +---------+     +---------+
|  comment   |     |   post  |     |  tag    |
|------------|*   1|---------|1   *|---------|
| post_id    |-----| post_id |-----| post_id |
| comment_id |     | ...     |     | tag_id  |
| user_id    |     |         |     | ...     |
| ...        |     |         |     | ...     |
+------------+     +---------+     +---------+

Trong trường hợp này, tốt hơn hết là nên có ít nhất hai truy vấn riêng biệt. Nếu bạn cố gắng tham gia thẻ và nhận xét, vì không có mối quan hệ trực tiếp giữa hai người, bạn sẽ kết thúc với mọi kết hợp có thể của thẻ và nhận xét. many * many == manymany. Bên cạnh đó, vì các bài đăng và thẻ không liên quan đến nhau, bạn có thể thực hiện song song hai truy vấn đó, dẫn đến lợi ích tiềm năng.

Tuy nhiên, hãy xem xét một kịch bản khác: Bạn muốn các bình luận được đính kèm vào một bài đăng và thông tin liên hệ của người bình luận.

 +----------+     +------------+     +---------+
 |   user   |     |  comment   |     |   post  |
 |----------|1   *|------------|*   1|---------|
 | user_id  |-----| post_id    |-----| post_id |
 | username |     | user_id    |     | ...     |
 | ...      |     | ...        |     +---------+
 +----------+     +------------+

Đây là nơi bạn nên xem xét tham gia. Ngoài việc là một truy vấn tự nhiên hơn nhiều, hầu hết các hệ thống cơ sở dữ liệu (bao gồm cả MySQL) có rất nhiều người thông minh đã nỗ lực rất nhiều để tối ưu hóa các truy vấn giống như nó. Đối với các truy vấn riêng biệt, vì mỗi truy vấn phụ thuộc vào kết quả của truy vấn trước đó, các truy vấn không thể được thực hiện song song và tổng thời gian không chỉ là thời gian thực hiện thực tế của các truy vấn mà còn cả thời gian tìm nạp kết quả, chọn lọc thông qua chúng cho ID cho truy vấn tiếp theo, liên kết các hàng với nhau, v.v.


Nếu bạn truy xuất nhiều cột người dùng trong kịch bản thứ hai (và cùng một người dùng nhận xét nhiều lần), điều này vẫn để ngỏ câu hỏi liệu họ có được truy xuất tốt nhất trong một truy vấn riêng không.
Adrian Baker

@AdrianBaker: Như tôi đã nói, rất nhiều người thông minh đã làm việc rất chăm chỉ. Nếu tôi sẽ tối ưu hóa máy chủ SQL của mình, ý tưởng đầu tiên của tôi sẽ là sử dụng nén, sẽ loại bỏ một lượng dư thừa khổng lồ mà không thay đổi mã nhiều lắm Tối ưu hóa cấp độ tiếp theo sẽ bao gồm việc sắp xếp lại kết quả vào các bảng và gửi chúng cùng với các bộ id của hàng, thư viện khách sau đó có thể dễ dàng lắp ráp bên cạnh khi cần.
cHao

Cả hai tối ưu hóa này đều có thể làm việc kỳ diệu với việc tham gia để giảm hoặc thậm chí loại bỏ sự dư thừa, nhưng không có nhiều điều có thể giúp với các truy vấn nối tiếp vốn có mà bạn phải làm để lấy các bản ghi liên quan.
cHao

3

Nó sẽ nhanh hơn về mặt thông lượng? Có lẽ. Nhưng nó cũng có khả năng khóa nhiều đối tượng cơ sở dữ liệu cùng một lúc (tùy thuộc vào cơ sở dữ liệu và lược đồ của bạn) và do đó làm giảm sự tương tranh. Theo kinh nghiệm của tôi, mọi người thường bị đánh lừa bởi đối số "ít chuyến đi khứ hồi cơ sở dữ liệu" hơn trong thực tế trên hầu hết các hệ thống OLTP nơi cơ sở dữ liệu nằm trên cùng một mạng LAN, nút cổ chai thực sự hiếm khi xảy ra với mạng.


2

Đây là một liên kết với 100 truy vấn hữu ích, chúng được kiểm tra trong cơ sở dữ liệu của Oracle nhưng hãy nhớ rằng SQL là một tiêu chuẩn, những gì khác nhau giữa Oracle, MS SQL Server, MySQL và các cơ sở dữ liệu khác là phương ngữ SQL:

http://javaforlearn.com/100-sql-queries-learn/


1

Có một số yếu tố có nghĩa là không có câu trả lời nhị phân. Câu hỏi về những gì là tốt nhất cho hiệu suất phụ thuộc vào môi trường của bạn. Nhân tiện, nếu lựa chọn duy nhất của bạn với mã định danh không phải là giây phụ, có thể có điều gì đó không đúng với cấu hình của bạn.

Câu hỏi thực sự cần hỏi là bạn muốn truy cập dữ liệu như thế nào. Lựa chọn duy nhất hỗ trợ ràng buộc muộn. Ví dụ: nếu bạn chỉ muốn thông tin nhân viên, bạn có thể chọn từ bảng Nhân viên. Các mối quan hệ khóa ngoài có thể được sử dụng để truy xuất các tài nguyên liên quan sau đó và khi cần thiết. Các lựa chọn sẽ có một chìa khóa để trỏ đến vì vậy chúng phải cực kỳ nhanh và bạn chỉ phải truy xuất những gì bạn cần. Độ trễ mạng phải luôn được tính đến.

Tham gia sẽ lấy tất cả dữ liệu cùng một lúc. Nếu bạn đang tạo một báo cáo hoặc điền vào lưới, đây có thể là chính xác những gì bạn muốn. Các phép nối được biên dịch và tối ưu hóa đơn giản sẽ nhanh hơn các lựa chọn đơn lẻ trong kịch bản này. Hãy nhớ rằng, tham gia Ad-hoc có thể không nhanh như vậy - bạn nên biên dịch chúng (thành một lưu trữ được lưu trữ). Câu trả lời tốc độ phụ thuộc vào kế hoạch thực hiện, chi tiết chính xác các bước mà DBMS thực hiện để lấy dữ liệu.


0

Có, một truy vấn sử dụng THAM GIA sẽ nhanh hơn. Mặc dù không biết mối quan hệ của các bảng bạn đang truy vấn, kích thước của tập dữ liệu của bạn hoặc vị trí của các khóa chính, nhưng hầu như không thể nói nhanh hơn bao nhiêu.

Tại sao không thử nghiệm cả hai kịch bản, sau đó bạn sẽ biết chắc chắn ...

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.