Tham gia là dành cho những người lười biếng?


169

Gần đây tôi đã có một cuộc thảo luận với một nhà phát triển khác, người đã tuyên bố với tôi rằng THAM GIA (SQL) là vô dụng. Điều này đúng về mặt kỹ thuật nhưng ông nói thêm rằng việc sử dụng các phép nối ít hiệu quả hơn so với việc thực hiện một số yêu cầu và bảng liên kết trong mã (C # hoặc Java).

Đối với anh ta tham gia là dành cho những người lười biếng không quan tâm đến hiệu suất. Điều này có đúng không? Chúng ta có nên tránh sử dụng tham gia?


114
Không. Cơ sở dữ liệu được tối ưu hóa để thực hiện các phép nối, chúng cực kỳ nhanh, đặc biệt đối với các bộ dữ liệu lớn. Bạn không muốn ứng dụng của mình tải hàng chục nghìn hàng và hợp nhất chúng lại với nhau theo cách thủ công.
Halfdan

91
Ngôn ngữ lập trình dành cho người lười biếng; chúng kém hiệu quả hơn so với mã hóa hướng dẫn CPU bằng tay. :)
Michael McGowan

76
Tên của nhà phát triển là gì? Tôi muốn chắc chắn rằng tôi không bao giờ thuê anh ta.
Joe

39
@Michael meh, lập trình viên thực sự sử dụng bướm ...
Marc Gravell

14
Re "điều này là đúng" - không, không phải vậy. Cơ sở dữ liệu hoạt động thông qua lý thuyết tập hợp; tham gia vào các bộ làm việc rất độc đáo và hữu ích ...
Marc Gravell

Câu trả lời:


188

Không, chúng ta nên tránh các nhà phát triển nắm giữ những ý kiến ​​cực kỳ sai lầm như vậy.

Trong nhiều trường hợp, tham gia cơ sở dữ liệu nhanh hơn nhiều lần so với mọi thứ được thực hiện thông qua máy khách, vì nó tránh được các vòng tròn DB và DB có thể sử dụng các chỉ mục để thực hiện phép nối.

Ngoài đỉnh đầu, tôi thậm chí không thể tưởng tượng được một kịch bản trong đó một phép nối được sử dụng chính xác sẽ chậm hơn so với thao tác phía máy khách tương đương.

Chỉnh sửa: Có một số trường hợp hiếm hoi trong đó mã máy khách tùy chỉnh có thể thực hiện mọi việc hiệu quả hơn so với tham gia DB đơn giản (xem nhận xét của meriton). Nhưng đây là rất nhiều ngoại lệ.


1
Thế còn 3 cách tham gia? Không có trường hợp nào bạn tốt hơn nên thực hiện chúng "bằng mã"?
julien_c

56
Tham gia vào máy chủ ứng dụng thể hiệu quả hơn nếu tham gia vào cơ sở dữ liệu gây ra sự dư thừa nghiêm trọng trong tập kết quả được gửi qua mạng. Hãy xem xét các bảng A và B, trong đó mỗi hàng trong A được liên kết với 20 hàng trong B, B chỉ có 100 hàng và chúng tôi muốn tìm nạp 1000 hàng đầu tiên từ A với các hàng được liên kết từ B. Tham gia vào cơ sở dữ liệu sẽ có kết quả là 20 * 1000 bộ dữ liệu được gửi qua mạng. Nếu việc nối được thực hiện trong máy chủ ứng dụng (lần đầu tiên tìm nạp toàn bộ bảng B vào bộ nhớ), chỉ 100 + 1000 hàng được gửi qua mạng.
meriton

7
Tuy nhiên, bạn chắc chắn đúng khi tham gia vào cơ sở dữ liệu nhanh hơn nhiều trong hầu hết các trường hợp, và do đó không chỉ là vấn đề thuận tiện, mà là cần thiết.
meriton

13
Tôi đã may mắn được nói chuyện với một số nhà phát triển làm việc trên SQL Server tại Microsoft. Nó sẽ khiến bạn choáng váng khi nghe những tối ưu hóa họ thực hiện trên các truy vấn. Bất cứ ai nghĩ rằng họ thông minh hơn thế cần phải bị đánh.
riwalk

2
@meriton Tôi hơi ngạc nhiên; Tôi hy vọng thư viện khách sẽ tối ưu hóa các phép nối chéo.
Phil Lello

83

Nghe có vẻ như đồng nghiệp của bạn sẽ làm tốt với cơ sở dữ liệu không có dữ liệu hoặc kho lưu trữ khóa-giá trị. Đó là những công cụ rất tốt và phù hợp cho nhiều vấn đề.

Tuy nhiên, một cơ sở dữ liệu quan hệ được tối ưu hóa rất nhiều để làm việc với các bộ. Có rất nhiều, rất nhiều cách để truy vấn dữ liệu dựa trên tham gia có bao la hiệu quả hơn rất nhiều chuyến đi vòng. Đây là nơi mà tính đa năng của một rdbms đến từ. Bạn cũng có thể đạt được điều tương tự trong một cửa hàng nosql, nhưng cuối cùng bạn thường xây dựng một cấu trúc riêng phù hợp với từng tính chất truy vấn khác nhau.

Tóm lại: Tôi không đồng ý. Trong một RDBMS, các phép nối là cơ bản . Nếu bạn không sử dụng chúng, bạn sẽ không sử dụng nó như một RDBMS.


46

Vâng, anh ấy sai trong trường hợp chung.

Cơ sở dữ liệu có thể tối ưu hóa bằng nhiều phương pháp khác nhau, được trợ giúp bởi các gợi ý tối ưu hóa, chỉ mục bảng, mối quan hệ khóa ngoài và có thể thông tin cụ thể của nhà cung cấp cơ sở dữ liệu khác.


1
Tôi phải thừa nhận khi tôi bắt đầu làm việc với cơ sở dữ liệu, tôi có cùng niềm tin rằng tôi có thể đánh bại hiệu suất của việc tham gia. Nhưng không mất nhiều thời gian để nhận ra DB đã tham gia nhanh đến mức nào. Trong thực tế, tôi sẽ nói trong tình huống này, tốt hơn là thảo luận với nhân viên một cách cởi mở hơn là gạt bỏ anh ta như một thằng ngốc.
Truyền thuyết Bước sóng

1
@LegendLpm Tôi nói điều đó thậm chí đúng nếu chúng không quá thông minh. Không cần phải thừa nhận sự thông minh bởi vì chúng cũng mắc phải những sai lầm giống như chúng ta nhớ (thực tế, đối với tôi điều đó có nghĩa là chúng không thông minh lắm ...) Đơn giản hơn: Nó hiếm khi giúp loại bỏ. Thỉnh thoảng có thể sai, thỉnh thoảng!
sehe

24

Không, bạn không nên.

Cơ sở dữ liệu được thiết kế đặc biệt để thao tác các bộ dữ liệu (rõ ràng ....). Do đó, họ cực kỳ hiệu quả trong việc này. Bằng cách thực hiện những gì về cơ bản là tham gia thủ công vào mã riêng của mình, anh ta đang cố gắng đảm nhận vai trò của một thứ được thiết kế riêng cho công việc. Cơ hội mã của anh ta có hiệu quả như trong cơ sở dữ liệu là rất xa.

Như một bên, không tham gia, điểm quan trọng trong việc sử dụng cơ sở dữ liệu là gì? anh ta cũng có thể chỉ sử dụng các tập tin văn bản.


2
Ngay cả khi không tham gia? Ánh xạ trong bộ nhớ tự động, bộ nhớ đệm truy vấn tự động, rất nhiều thứ tự động khác hoàn toàn không xảy ra với hầu hết các hệ thống tập tin. Oh, tôi đã đề cập đến các giao dịch có thể kiểm soát tốt?
Piskvor rời khỏi tòa nhà

19

Nếu "lười biếng" được định nghĩa là những người muốn viết ít mã hơn, thì tôi đồng ý. Nếu "lười biếng" được định nghĩa là những người muốn có công cụ làm những gì họ giỏi, tôi đồng ý. Vì vậy, nếu anh ta chỉ đồng ý với Larry Wall (liên quan đến các thuộc tính của các lập trình viên giỏi), thì tôi đồng ý với anh ta.


Tôi đã thêm độ chính xác của sự lười biếng: đối với những người lười biếng không quan tâm đến các buổi biểu diễn và thích viết ít mã hơn. Tôi nghĩ rằng tham gia là dành cho những người lười biếng nhưng trong trường hợp này tham gia cũng tốt hơn một số yêu cầu.
Bastien Vandamme

3
@Dran Dane: Joins dành cho những người lười biếng, vâng. Thực tế là họ có thể sẽ thực hiện tốt là trực giao.
Piskvor rời khỏi tòa nhà

16

Ummm, tham gia là cách cơ sở dữ liệu quan hệ liên kết các bảng với nhau. Tôi không chắc anh ấy đang làm gì.

Làm thế nào để thực hiện một số cuộc gọi đến cơ sở dữ liệu hiệu quả hơn một cuộc gọi? Cộng với động cơ sql được tối ưu hóa để làm điều này.

Có thể đồng nghiệp của bạn quá lười học SQL.


12

Vâng, bạn nên.

Và bạn nên sử dụng C ++ thay vì C # vì hiệu suất. C # dành cho người lười biếng.

Không không không. Bạn nên sử dụng C thay vì C ++ vì hiệu suất. C ++ dành cho những người lười biếng.

Không không không. Bạn nên sử dụng lắp ráp thay vì C vì hiệu suất. C dành cho người lười biếng.

Vâng, tôi đang nói đùa. bạn có thể tạo các chương trình nhanh hơn mà không cần tham gia và bạn có thể tạo các chương trình sử dụng ít bộ nhớ hơn mà không cần tham gia. NHƯNG trong nhiều trường hợp, thời gian phát triển của bạn quan trọng hơn thời gian và bộ nhớ CPU. Từ bỏ một chút hiệu suất và tận hưởng cuộc sống của bạn. Đừng lãng phí thời gian của bạn cho hiệu suất nhỏ. Và nói với anh ta "Tại sao bạn không làm một đường cao tốc thẳng từ nơi bạn đến văn phòng của bạn?"


1
Tôi đã xem tất cả các câu trả lời của bạn cho đến nay và chúng rất buồn cười. Hãy tiếp tục đến. Hoặc là hoặc, tôi có thể đăng ký vào blog của bạn ở đâu?
Gerry

11

"Đây là kỹ thuật đúng" - tương tự, cơ sở dữ liệu SQL là vô ích: điểm nào trong việc sử dụng một khi bạn có thể nhận được kết quả tương tự bằng cách sử dụng một loạt các tệp CSV và tương quan chúng trong mã? Heck, bất kỳ sự trừu tượng nào là dành cho những người lười biếng, hãy quay lại lập trình bằng mã máy ngay trên phần cứng! ;)

Ngoài ra, khẳng định của anh ta là không đúng sự thật trong tất cả các trường hợp ngoại trừ nhất: RDBMS được tối ưu hóa mạnh mẽ để làm cho THAM GIA nhanh chóng . Hệ thống quản lý cơ sở dữ liệu quan hệ, phải không?


2
+1 Cụm từ "... đúng về mặt kỹ thuật" sẽ hoạt động tốt hơn nếu OP đã sử dụng từ unnecessarythay vì uselesstrong câu trước. Nói rằng tham gia là vô ích là không có thật, không có kỹ thuật cần phải xem xét. Trong mọi trường hợp, sự hiểu lầm của OP và đồng nghiệp về quan điểm của RDBMS là không phổ biến: stackoverflow.com/q/5575682/47550
Paul Sasik

7

Công ty cuối cùng tôi làm việc cũng không sử dụng SQL tham gia. Thay vào đó, họ chuyển công việc này sang lớp ứng dụng được thiết kế theo tỷ lệ theo chiều ngang. Lý do căn bản của thiết kế này là để tránh làm việc ở lớp cơ sở dữ liệu. Nó thường là cơ sở dữ liệu trở thành nút cổ chai. Nó dễ dàng để nhân rộng lớp ứng dụng hơn cơ sở dữ liệu. Có thể có những lý do khác. Nhưng đây là cái mà tôi có thể nhớ lại bây giờ.

Có, tôi đồng ý rằng các phép nối được thực hiện ở lớp ứng dụng là không hiệu quả so với các phép nối được thực hiện bởi cơ sở dữ liệu. Truyền thông mạng nhiều hơn.

Xin lưu ý rằng tôi không chịu khó tránh khỏi việc tham gia SQL.


Chà, nghe có vẻ như một cuộc tranh luận hợp lý chống lại THAM GIA trong trường hợp cụ thể của bạn. Tôi nhớ rằng FB Engineering đã đăng một cái gì đó tương tự trên blog của họ - nhân rộng ra cũng là ưu tiên chính của họ. Than ôi, chỉ một% nhỏ lập trình viên sẽ cần phải làm điều này, nhưng nhiều người nghĩ rằng họ làm "bởi vì OMG Facebook cũng làm điều đó";)
Piskvor rời khỏi tòa nhà

được rồi, trong một giải pháp doanh nghiệp nơi bạn có đủ lưu lượng để làm quá tải máy chủ cơ sở dữ liệu, điều này có thể đáng xem xét nhưng nhiều khả năng đó là báo cáo thủ tục được lưu trữ hoặc sao lưu dự kiến ​​đóng đinh hiệu suất. Cơ sở dữ liệu rất tốt khi tham gia, đặc biệt là nếu có sự giúp đỡ
Jodrell

@Jodrell: Vâng, họ rất giỏi tham gia; một lần nữa, có những trường hợp góc mà bạn cần bỏ đi sự thanh lịch của người tham gia để có thêm sức mạnh. Tôi đã gặp một tình huống như vậy; chúng tôi đã thử mọi giải pháp có thể, và thực sự giải pháp không tham gia là nhanh nhất trong tình huống rất cụ thể đó . Và không, không có bất cứ thứ gì khác đang chạy ở máy chủ cụ thể đó; các thủ tục được lưu trữ không thể làm bạn chậm lại nếu bạn không có bất kỳ;)
Piskvor rời khỏi tòa nhà

5

Nếu không tham gia, làm thế nào bạn có thể liên kết các mục đặt hàng với các đơn đặt hàng? Đó là toàn bộ điểm của một hệ thống quản lý cơ sở dữ liệu quan hệ. Không tham gia thì không có dữ liệu quan hệ và bạn cũng có thể sử dụng các tệp văn bản để xử lý dữ liệu.

Có vẻ như anh ta không hiểu khái niệm này nên anh ta cố gắng làm cho có vẻ như họ vô dụng. Anh ấy là kiểu người nghĩ excel là một ứng dụng cơ sở dữ liệu. Tát anh ta một cách ngớ ngẩn và bảo anh ta đọc thêm về cơ sở dữ liệu. Tạo nhiều kết nối và kéo dữ liệu và hợp nhất dữ liệu qua C # là cách làm sai.


5

Tôi không hiểu logic của câu lệnh "tham gia vào SQL là vô ích". Có hữu ích để lọc và giới hạn dữ liệu trước khi làm việc không? Như những người trả lời khác của bạn đã tuyên bố đây là những gì công cụ cơ sở dữ liệu làm, nó nên là những gì họ giỏi.

Có lẽ một lập trình viên lười biếng sẽ gắn bó với các công nghệ mà họ quen thuộc và tránh những khả năng khác vì những lý do phi kỹ thuật.

Tôi để nó cho bạn quyết định.


5

Hãy xem xét một ví dụ: bảng có bản ghi hóa đơn và bảng có liên quan với bản ghi chi tiết đơn hàng hóa đơn. Hãy xem xét mã giả của khách hàng:

for each (invoice in invoices)
    let invoiceLines = FindLinesFor(invoice)
...

Nếu bạn có 100.000 hóa đơn với 10 dòng mỗi mã, mã này sẽ tra cứu 10 dòng hóa đơn từ bảng 1 triệu và nó sẽ thực hiện 100.000 lần. Khi kích thước bảng tăng lên, số lượng thao tác chọn sẽ tăng lên, và chi phí của mỗi thao tác chọn sẽ tăng.

Trở thành máy tính nhanh, bạn có thể không nhận thấy sự khác biệt về hiệu suất giữa hai cách tiếp cận nếu bạn có vài nghìn bản ghi hoặc ít hơn. Bởi vì chi phí tăng nhiều hơn tuyến tính, khi số lượng hồ sơ tăng (lên tới hàng triệu, giả sử), bạn sẽ bắt đầu nhận thấy sự khác biệt và sự khác biệt sẽ trở nên khó chấp nhận hơn khi kích thước của tập dữ liệu tăng lên.

Việc tham gia, tuy nhiên. sẽ sử dụng các chỉ mục của bảng và hợp nhất hai tập dữ liệu. Điều này có nghĩa là bạn đang quét bảng thứ hai một cách hiệu quả thay vì truy cập ngẫu nhiên N lần. Nếu có khóa ngoại được xác định, cơ sở dữ liệu đã có các liên kết giữa các bản ghi liên quan được lưu trữ bên trong.

Hãy tưởng tượng làm điều này chính mình. Bạn có một danh sách theo thứ tự chữ cái của học sinh và một cuốn sổ ghi chép với tất cả các báo cáo điểm của học sinh (một trang cho mỗi lớp). Sổ ghi chép được sắp xếp theo thứ tự theo tên của học sinh, theo thứ tự giống như danh sách. Làm thế nào bạn muốn tiến hành?

  1. Đọc tên từ danh sách.
  2. Mở vở ra.
  3. Tìm tên của học sinh.
  4. Đọc điểm của học sinh, lật trang cho đến khi bạn đến được học sinh tiếp theo hoặc trang cuối cùng.
  5. Đóng vở.
  6. Nói lại.

Hoặc là:

  1. Mở cuốn sổ ra trang đầu tiên.
  2. Đọc tên từ danh sách.
  3. Đọc bất kỳ điểm nào cho tên đó từ sổ ghi chép.
  4. Lặp lại các bước 2-3 cho đến khi bạn kết thúc
  5. Đóng vở.

5

Âm thanh như một trường hợp kinh điển của " Tôi có thể viết nó tốt hơn ." Nói cách khác, anh ta đang nhìn thấy thứ gì đó mà anh ta thấy là một nỗi đau ở cổ (viết một loạt các phép nối bằng SQL) và nói "Tôi chắc chắn rằng tôi có thể viết nó tốt hơn và có hiệu suất tốt hơn." Bạn nên hỏi anh ta nếu anh ta là một) thông minh hơn và b) có học thức hơn người điển hình nằm sâu trong mã tối ưu hóa Máy chủ Oracle hoặc SQL. Odds là anh ấy không.


3

Anh ấy chắc chắn là sai. Mặc dù có những ưu điểm nhất định đối với thao tác dữ liệu trong các ngôn ngữ như C # hoặc Java, các phép nối nhanh nhất trong cơ sở dữ liệu do bản chất của chính SQL.

SQL tiếp tục chi tiết các số liệu thống kê liên quan đến dữ liệu và nếu bạn đã tạo các chỉ mục của mình một cách chính xác, có thể nhanh chóng tìm thấy một bản ghi trong vài triệu. Bên cạnh thực tế là tại sao bạn muốn kéo tất cả dữ liệu của mình vào C # để thực hiện tham gia khi bạn có thể thực hiện ngay trên cấp độ cơ sở dữ liệu?

Ưu điểm cho việc sử dụng C # phát huy tác dụng khi bạn cần làm điều gì đó lặp đi lặp lại. Nếu bạn cần thực hiện một số chức năng cho mỗi hàng, có thể nhanh hơn để thực hiện điều đó trong C #, nếu không, việc nối dữ liệu được tối ưu hóa trong DB.


3

Tôi sẽ nói rằng tôi đã gặp phải trường hợp nhanh hơn phá vỡ truy vấn và thực hiện các phép nối trong mã. Điều đó đang được nói, chỉ với một phiên bản cụ thể của MySQL mà tôi phải làm điều đó. Mọi thứ khác, cơ sở dữ liệu có thể sẽ nhanh hơn (lưu ý rằng bạn có thể phải tối ưu hóa các truy vấn, nhưng nó vẫn sẽ nhanh hơn).


3

Tôi nghi ngờ anh ta có một cái nhìn hạn chế về những cơ sở dữ liệu nên được sử dụng cho. Một cách tiếp cận để tối đa hóa hiệu suất là đọc toàn bộ cơ sở dữ liệu vào bộ nhớ. Trong tình huống này, bạn có thể có hiệu suất tốt hơn và bạn có thể muốn thực hiện tham gia nếu bộ nhớ cho hiệu quả. Tuy nhiên, điều này không thực sự sử dụng cơ sở dữ liệu, như một cơ sở dữ liệu IMHO.


3
Hầu hết các công cụ cơ sở dữ liệu sẽ làm điều này cho bạn đằng sau hậu trường; và ví dụ trong MySQL, bạn có thể tạo một bảng trong bộ nhớ ( MEMORYđộng cơ) hoàn toàn. Thực hiện lại chức năng cơ sở dữ liệu mà không có cơ sở dữ liệu thường là dấu hiệu của một trường hợp nghiêm trọng của NIH;)
Piskvor rời khỏi tòa nhà

@phoog: Không được phát minh ở đây - nói cách khác, "Tôi không nghĩ về điều đó, vì vậy nó không tồn tại". Nhiều bánh xe vuông đã được phát minh lại vì điều này. (và vâng, đôi khi việc phát minh lại bánh xe rất hữu ích, ví dụ: nếu bạn đang chế tạo xe đua; phát minh lại "chỉ vì" không có khả năng giúp bạn có bánh xe tốt hơn)
Piskvor rời khỏi tòa nhà vào

Nói cách khác, "Tôi đã không làm cho nó để nó phải là rác". Điều này có một hạt sự thật chỉ cho đến khi "Tôi chưa thử nó vì vậy nó có thể không phù hợp với mục đích của tôi", vì vậy hãy kiểm tra nó trước khi bạn phán xét nó.
Peter Lawrey

@Piskvor: Không nhất thiết, cơ sở dữ liệu chỉ có thể sử dụng bộ nhớ của hệ thống mà nó chạy, trong khi ứng dụng có thể sử dụng bộ nhớ của máy chủ ứng dụng. Đặt khác nhau: Nếu cơ sở dữ liệu nằm trên một máy chủ chuyên dụng, việc truy cập bộ đệm đó vẫn yêu cầu băng thông mạng và phải chịu độ trễ của mạng, nhưng bất kỳ bộ đệm nào mà ứng dụng giữ có thể được truy vấn với tốc độ truy cập bộ nhớ thấp.
meriton

2

Không, không chỉ các phép nối được tối ưu hóa tốt hơn trong mã cơ sở dữ liệu mà ad-hoc C # / Java; nhưng thường có thể áp dụng một số kỹ thuật lọc, mang lại hiệu suất cao hơn.


2

Ông đã sai, tham gia là những gì lập trình viên có thẩm quyền sử dụng. Có thể có một vài trường hợp giới hạn trong đó phương pháp được đề xuất của anh ta hiệu quả hơn (và có lẽ tôi sẽ sử dụng cơ sở dữ liệu Tài liệu) nhưng tôi không thể thấy nó nếu bạn có bất kỳ lượng dữ liệu lừa đảo nào. Ví dụ: lấy truy vấn này:

select t1.field1 
from table1 t1
join table2 t2 
    on t1.id = t2.id
where t1.field2 = 'test'

Giả sử bạn có 10 triệu bản ghi trong bảng1 và 1 triệu bản ghi trong bảng2. Giả sử 9 triệu bản ghi trong bảng 1 đáp ứng mệnh đề where. Giả sử chỉ có 15 người trong số họ ở trong bảng2. Bạn có thể chạy câu lệnh sql này, nếu được lập chỉ mục đúng sẽ mất mili giây và trả về 15 bản ghi trên mạng chỉ với 1 cột dữ liệu. Hoặc bạn có thể gửi mười triệu bản ghi với 2 cột dữ liệu và gửi riêng 1 triệu bản ghi khác với một cột dữ liệu trên mạng và kết hợp chúng trên máy chủ web.

Hoặc tất nhiên bạn có thể giữ toàn bộ nội dung của cơ sở dữ liệu trên máy chủ web mọi lúc, điều này thật ngớ ngẩn nếu bạn có nhiều hơn một lượng dữ liệu và dữ liệu không đáng kể liên tục thay đổi. Nếu bạn không cần những phẩm chất của cơ sở dữ liệu quan hệ thì đừng sử dụng cơ sở dữ liệu. Nhưng nếu bạn làm, sau đó sử dụng nó một cách chính xác.


2

Tôi đã nghe cuộc tranh luận này khá thường xuyên trong suốt sự nghiệp là một nhà phát triển phần mềm. Hầu như mọi lúc mọi nơi đều được tuyên bố, anh chàng đưa ra yêu sách không có nhiều kiến ​​thức về các hệ thống cơ sở dữ liệu quan hệ, cách họ làm việc và cách sử dụng các hệ thống như vậy.

Có, khi sử dụng không chính xác , tham gia dường như vô dụng hoặc thậm chí nguy hiểm. Nhưng khi được sử dụng đúng cách, có rất nhiều tiềm năng để triển khai cơ sở dữ liệu để thực hiện tối ưu hóa và "giúp" nhà phát triển truy xuất kết quả chính xác một cách hiệu quả nhất.

Đừng quên rằng việc JOINbạn nói với cơ sở dữ liệu về cách bạn mong đợi các phần dữ liệu có liên quan với nhau và do đó cung cấp cho cơ sở dữ liệu nhiều thông tin hơn về những gì bạn đang cố gắng thực hiện và do đó làm cho nó có thể phù hợp hơn với nhu cầu của bạn.

Vì vậy, câu trả lời chắc chắn là: Không, hoàn toàn JOINSkhông vô dụng!


0

Điều này là "đúng về mặt kỹ thuật" chỉ trong một trường hợp không được sử dụng thường xuyên trong các ứng dụng (khi tất cả các hàng của tất cả các bảng trong (các) phép nối được trả về bởi truy vấn). Trong hầu hết các truy vấn, chỉ một phần của các hàng của mỗi bảng được trả về. Công cụ cơ sở dữ liệu thường sử dụng các chỉ mục để loại bỏ các hàng không mong muốn, đôi khi thậm chí không đọc hàng thực tế vì nó có thể sử dụng các giá trị được lưu trữ trong các chỉ mục. Công cụ cơ sở dữ liệu được viết bằng C, C ++, v.v. và ít nhất là hiệu quả như mã được viết bởi nhà phát triển.


0

Trừ khi tôi hiểu lầm nghiêm trọng, logic trong câu hỏi rất thiếu sót

Nếu có 20 hàng trong B cho mỗi A, thì 1000 hàng trong A ngụ ý 20k hàng trong B. Không thể chỉ có 100 hàng trong B trừ khi có nhiều bảng "AB" với 20k hàng có chứa ánh xạ .

Vì vậy, để có được tất cả thông tin về 20 trong số 100 hàng B ánh xạ cho mỗi hàng A bạn cũng bảng AB. Vì vậy, đây sẽ là:

  • 3 bộ kết quả gồm 100, 1000 và 20 nghìn hàng và một khách hàng THAM GIA
  • một kết quả A-AB-B được THAM GIA duy nhất với 20k hàng

Vì vậy, "THAM GIA" trong máy khách sẽ thêm bất kỳ giá trị nào khi bạn kiểm tra dữ liệu. Không phải đó không phải là một ý tưởng tồi. Nếu tôi đang lấy một đối tượng từ cơ sở dữ liệu thì có lẽ sẽ có ý nghĩa hơn khi chia nó thành các tập kết quả riêng biệt. Đối với một cuộc gọi loại báo cáo, tôi sẽ làm phẳng nó thành một cuộc gọi gần như luôn luôn.

Trong mọi trường hợp, tôi muốn nói rằng hầu như không có sự tham gia chéo nào của cường độ này. Đó là một ví dụ nghèo nàn.

Bạn phải THAM GIA ở đâu đó và đó là những gì RDBMS giỏi. Tôi không muốn làm việc với bất kỳ khỉ mã khách hàng nào nghĩ rằng họ có thể làm tốt hơn.

Suy nghĩ lại:

Để tham gia vào máy khách cần có các đối tượng liên tục như DataTables (trong .net). Nếu bạn có một kết quả được làm phẳng, nó có thể được sử dụng thông qua một cái gì đó nhẹ hơn như DataReader. Khối lượng lớn = nhiều tài nguyên khách hàng được sử dụng để tránh cơ sở dữ liệu THAM GIA.

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.