2010-04-16 25 views

Trả lời

11

Cách thứ hai là cách làm cổ điển, từ trước khi từ khóa join tồn tại.

Thông thường bộ xử lý truy vấn tạo ra các hoạt động cơ sở dữ liệu giống nhau từ hai truy vấn, do đó sẽ không có sự khác biệt về hiệu suất.

Sử dụng join mô tả tốt hơn những gì bạn đang làm trong truy vấn. Nếu bạn có nhiều tham gia, nó cũng tốt hơn vì bảng đã tham gia và điều kiện của nó nằm cạnh nhau, thay vì đặt tất cả các bảng ở một nơi và tất cả các điều kiện trong một vị trí khác.

Một khía cạnh khác là dễ dàng hơn để thực hiện một phép nối không bị ràng buộc do nhầm lẫn bằng cách sử dụng cách thứ hai, dẫn đến kết hợp chéo chứa tất cả các kết hợp từ hai bảng.

+0

Đồng ý, đầu tiên là tốt hơn cho rõ ràng và controle; dễ dàng thay đổi loại tham gia nếu bạn muốn. –

1

tìm hiểu bằng cách sử dụng EXPLAIN SELECT …

nó phụ thuộc vào động cơ được sử dụng, trên truy vấn tối ưu, trên các phím, trên bàn; trên khá nhiều tất cả mọi thứ

3

Sử dụng đầu tiên, vì nó là:

  • rõ ràng hơn
  • có phải là cách chuẩn

Đối với hiệu suất - không nên có sự khác biệt.

+2

Nó cũng cho phép bạn tách biệt các điều kiện nối (trong mệnh đề ON) từ điều kiện lọc (trong mệnh đề WHERE) –

0

Hầu hết các cơ sở dữ liệu hiện tại sẽ tối ưu hóa cả hai truy vấn đó vào cùng một kế hoạch thực hiện giống nhau. Tuy nhiên, sử dụng cú pháp đầu tiên, nó là tiêu chuẩn hiện hành. Bằng cách tìm hiểu và sử dụng cú pháp kết hợp này, nó sẽ giúp bạn khi bạn thực hiện các truy vấn với LEFT OUTER JOINRIGHT OUTER JOIN. trở nên phức tạp và có vấn đề khi sử dụng cú pháp cũ hơn với các phép nối trong mệnh đề WHERE.

+0

Tôi đã thấy rằng trong một cơ sở dữ liệu chuẩn hóa đúng cách, việc tham gia RIGHT nên hiếm khi được sử dụng, trong một cơ sở dữ liệu không chuẩn hóa, điều này không phải lúc nào cũng đúng. Tôi sử dụng điều này như một biện pháp cần thiết để tái cấu trúc lại sự bình thường hóa/cấu trúc. –

+0

@Mark Schultheiss, xem câu hỏi này: http://stackoverflow.com/questions/689963/does-anyone-use-right-outer-joins –

+0

chính xác, chỉ cần thay đổi thứ tự bảng thường sẽ thực hiện quyền tham gia một phép nối trái, Từ kinh nghiệm của tôi là dễ dàng hơn trong chu kỳ bảo trì, đặc biệt là cho các nhà phát triển cơ sở –

1

Trong một số công cụ SQL, biểu mẫu thứ hai (kết hợp liên kết) bị loại bỏ. Sử dụng mẫu đầu tiên.

Thứ hai ít rõ ràng hơn, khiến cho người bắt đầu SQL phải tạm dừng khi viết mã. Việc quản lý SQL phức tạp hơn rất nhiều do chuỗi yêu cầu khớp nối khớp với chuỗi mệnh đề WHERE - chúng (đối số trong mã) phải khớp hoặc kết quả trả về sẽ thay đổi làm cho thay đổi tập dữ liệu trả về thực sự đi ngược lại ý nghĩ rằng trình tự không nên thay đổi kết quả khi các yếu tố ở cùng cấp được xem xét.

Khi tham gia có chứa nhiều bảng được tạo, nó khó thực sự mã, khá nhanh bằng cách sử dụng biểu mẫu thứ hai.

EDIT: Hiệu suất: Tôi xem xét mã hóa, gỡ lỗi phần dễ dàng của hiệu suất cá nhân, do đó dễ chỉnh sửa/gỡ lỗi/bảo trì tốt hơn bằng cách sử dụng biểu mẫu đầu tiên - nó chỉ mất ít thời gian hơn để làm/hiểu nội dung trong quá trình phát triển và chu kỳ bảo trì.

+1

Chỉ cần rõ ràng, hình thức depricated là '* =' và '= *' trên biểu mẫu cho TRÁI và PHẢI không phải là dấu phẩy chuẩn ANSI được phân tách cho các bảng. ..xin lỗi nếu tôi thêm nhầm lẫn bởi phần đó :) –

0

Lọc tham gia chỉ bằng WHERE có thể vô cùng không hiệu quả trong một số trường hợp phổ biến.Ví dụ:

SELECT * FROM people p, companies c WHERE p.companyID = c.id AND p.firstName = 'Daniel' 

Hầu hết các cơ sở dữ liệu sẽ thực hiện truy vấn này theo đúng nghĩa đen, đầu tiên lấy sản phẩm Descartes của nhân dân và bảng công ty và sau đó lọc theo những người mà có phù hợp với lĩnh vực companyID và id. Trong khi sản phẩm hoàn toàn không bị giới hạn không tồn tại ở bất cứ nơi nào nhưng trong bộ nhớ và sau đó chỉ trong một khoảnh khắc, tính toán của nó mất một thời gian.

Một cách tiếp cận tốt hơn là nhóm các ràng buộc bằng JOIN khi có liên quan. Điều này không chỉ dễ đọc hơn mà còn hiệu quả hơn rất nhiều. Thusly:

SELECT * FROM people p JOIN companies c ON p.companyID = c.id 
    WHERE p.firstName = 'Daniel' 

Đó là lâu hơn một chút, nhưng cơ sở dữ liệu có khả năng nhìn vào mệnh đề ON và sử dụng nó để tính toán đầy đủ chế THAM GIA trực tiếp, chứ không phải bắt đầu với tất cả mọi thứ và sau đó hạn chế xuống. Điều này nhanh hơn để tính toán (đặc biệt là với các tập dữ liệu lớn và/hoặc tham gia nhiều bảng) và yêu cầu ít bộ nhớ hơn.

Tôi thay đổi mọi truy vấn tôi thấy sử dụng cú pháp "dấu phẩy". Theo tôi, mục đích duy nhất cho sự tồn tại của nó là sự đồng nhất. Xem xét tác động hiệu suất, tôi không nghĩ đây là một lý do thuyết phục.

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