2013-05-03 33 views
33

tôi chỉ quét dọn một số sql khi tôi đi qua truy vấn này:Lệnh Sql JOIN có ảnh hưởng đến hiệu năng không?

SELECT 
     jm.IMEI , 
     jm.MaxSpeedKM , 
     jm.MaxAccel , 
     jm.MaxDeccel , 
     jm.JourneyMaxLeft , 
     jm.JourneyMaxRight , 
     jm.DistanceKM , 
     jm.IdleTimeSeconds , 
     jm.WebUserJourneyId , 
     jm.lifetime_odo_metres , 
     jm.[Descriptor] 
FROM dbo.Reporting_WebUsers AS wu WITH (NOLOCK) 
     INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId 
     INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId 
WHERE (wu.isActive = 1) 
     AND (j.JourneyDuration > 2) 
     AND (j.JourneyDuration < 1000) 
     AND (j.JourneyDistance > 0) 

Câu hỏi của tôi là nó thực hiện bất kỳ khác biệt hiệu suất thứ tự của các tham gia như đối với các truy vấn trên tôi đã làm

FROM dbo.Reporting_JourneyMaster90 AS jm 

và sau đó tham gia 2 bảng còn lại vào số

+0

Thử chạy cả hai và xem các kế hoạch thực hiện. Họ có khác biệt không? Tôi sẽ không mong đợi họ được. –

+0

Tôi chưa bao giờ nghe nói về nó ảnh hưởng đến hiệu suất. –

+0

Nếu một truy vấn đơn giản như vậy là chậm, tôi sẽ giả sử bạn cần phải xem xét chỉ mục. – HLGEM

Trả lời

27

Không, JOIN by order được thay đổi trong quá trình tối ưu hóa.

Thông báo trước duy nhất là Tùy chọn FORCE ORDER sẽ buộc tham gia xảy ra theo đúng thứ tự bạn đã chỉ định.

+0

Tôi vừa có một ví dụ sử dụng MySQL, nơi nó đã làm vấn đề, bởi vì tôi đã đặt hàng trên một ngày mà đã được tham gia từ một bảng khác. Việc chuyển đổi thứ tự đã giảm thời gian thực hiện xuống 20%. Và sau đó, thêm phân trang, nó giảm thời gian thực hiện xuống 80%. Vì vậy, tôi đoán nó phụ thuộc. – smerlung

4

Thông thường là không. Tôi không 100% điều này áp dụng nguyên văn cho Sql-Server, nhưng trong Postgres, người lập kế hoạch truy vấn có quyền sắp xếp lại các kết nối bên trong khi nó thấy phù hợp. Ngoại lệ là khi bạn đạt đến ngưỡng vượt quá mức quá đắt để điều tra thay đổi thứ tự của chúng.

5

JOIN đơn đặt hàng không quan trọng, công cụ truy vấn sẽ sắp xếp lại thứ tự của chúng dựa trên thống kê cho chỉ mục và các nội dung khác.

Đối với kiểm tra thực hiện như sau:

  • chọn chương trình kế hoạch thực hiện thực tế và chạy truy vấn đầu tiên
  • thay đổi JOIN trật tự và bây giờ chạy truy vấn một lần nữa
  • so sánh thực hiện kế hoạch

Họ phải giống hệt như công cụ truy vấn sẽ tổ chức lại chúng theo các yếu tố khác.

Như đã nhận xét trên bảng kê khác, bạn có thể sử dụng OPTION (FORCE ORDER) để sử dụng chính xác thứ tự bạn muốn nhưng có thể nó sẽ không hiệu quả nhất.

Như quy tắc chung, lệnh JOIN phải có bảng ít nhất trên cùng và hầu hết các bản ghi cuối cùng, vì một số động cơ DBMS có thể tạo sự khác biệt, cũng như lệnh FORCE ORDER được sử dụng để giúp giới hạn kết quả.

-5

Sai. SQL Server 2005 nó chắc chắn quan trọng vì bạn đang hạn chế tập dữ liệu từ đầu của mệnh đề FROM. Nếu bạn bắt đầu với 2000 hồ sơ thay vì 2 triệu nó làm cho truy vấn của bạn nhanh hơn.

29

Tham gia đơn đặt hàng trong máy chủ SQL2008R2 không nghi ngờ gì ảnh hưởng đến hiệu suất truy vấn, đặc biệt trong các truy vấn có số lượng lớn bảng tham gia với điều khoản được áp dụng cho nhiều bảng.

Mặc dù thứ tự tham gia được thay đổi trong tối ưu hóa, trình tối ưu hóa không thử tất cả các đơn đặt hàng có thể tham gia. Nó dừng lại khi nó tìm thấy những gì nó xem xét một giải pháp khả thi vì hành động tối ưu hóa rất sử dụng tài nguyên quý giá.

Chúng tôi đã thấy các truy vấn hoạt động như chó (1 phút + thời gian thực hiện) đi xuống hiệu suất phụ thứ hai chỉ bằng cách thay đổi thứ tự của biểu thức nối. Tuy nhiên, xin lưu ý rằng đây là các truy vấn có từ 12 đến 20 lần tham gia và điều khoản trên một số bảng.

Bí quyết là đặt đơn đặt hàng của bạn để giúp trình tối ưu hóa truy vấn tìm ra điều gì có ý nghĩa. Bạn có thể sử dụng Force Order nhưng điều đó có thể quá cứng nhắc. Hãy thử để đảm bảo rằng thứ tự tham gia của bạn bắt đầu với các bảng, nơi sẽ làm giảm dữ liệu nhất thông qua các mệnh đề.

+2

Tôi đã làm việc với máy chủ SQL trong hơn 10 năm và lần đầu tiên bắt đầu thấy thứ tự JOIN ảnh hưởng đến hiệu suất như được nêu trong câu trả lời này. Bị mắc kẹt, nghĩ rằng người tối ưu hóa biết rõ nhất, tôi tình cờ gặp điều này trong khi tìm kiếm những người khác đã nhìn thấy hành vi tương tự. Có, thống kê của tôi là tất cả các cập nhật. –

+3

Điều này có thể chỉ là một vấn đề sniffing tham số quá, nơi mà bất kỳ thay đổi để truy vấn ở tất cả sẽ có những điều được cải thiện. –

+5

@TomTom Thậm chí cấp cho cuốn sách tối ưu hóa dựa trên chi phí của Fritchey nói về các tình huống cụ thể này khi "trình tối ưu hóa từ bỏ" trên các truy vấn phức tạp. Anh ta thậm chí còn có thể chứng minh nó bằng cách sử dụng DB demo của Microsoft. –

8

Tôi có ví dụ rõ ràng về kết nối bên trong ảnh hưởng đến hiệu suất. Nó là một sự kết hợp đơn giản giữa hai bảng. Một người có hơn 50 triệu bản, người kia có 2.000. Nếu tôi chọn từ bảng nhỏ hơn và tham gia lớn hơn, nó sẽ mất hơn 5 phút.

Nếu tôi chọn từ bảng lớn hơn và tham gia phần nhỏ hơn, mất khoảng 2 phút 30 giây.

Đây là với SQL Server 2012.

Đối với tôi điều này trực quan vì tôi đang sử dụng tập dữ liệu lớn nhất cho truy vấn ban đầu.

+11

Nó sẽ nâng cao câu trả lời của bạn nếu bạn có thể hiển thị kế hoạch thực hiện cho cả hai trường hợp – PeterVermont

+1

Vâng, có lẽ mệnh đề where giới hạn bảng lớn thành một tập nhỏ trong khi nó không thể giảm bớt bảng nhỏ hơn của bạn? – user2173353

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