Khái niệm cơ bản về kế hoạch thực hiện - Nhầm lẫn trận đấu Hash


39

Tôi đang bắt đầu tìm hiểu các kế hoạch thực hiện và bối rối về cách chính xác một trận đấu băm hoạt động và lý do tại sao nó sẽ được sử dụng trong một phép nối đơn giản:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

nhập mô tả hình ảnh ở đây

Theo tôi hiểu, kết quả của việc quét chỉ mục hàng đầu trở thành khả năng băm và mỗi hàng trong phần quét chỉ mục dưới cùng được tìm kiếm. Tôi hiểu cách các bảng băm hoạt động ở ít nhất một mức độ nào đó, nhưng tôi bối rối về việc giá trị nào được băm chính xác trong một ví dụ như thế này.

Điều có ý nghĩa với tôi là trường chung giữa chúng, id, được băm - nhưng nếu đây là trường hợp, tại sao lại băm một số?

Câu trả lời:


29

Như câu trả lời của SQLRockstar

tốt nhất cho đầu vào lớn, chưa phân loại.

Hiện nay,

  • từ quá trình quét chỉ mục Users.DisplayName (giả định không bao gồm), bạn nhận được Users.Id (giả sử được nhóm) = chưa được sắp xếp
  • Bạn cũng đang quét Bài đăng cho Chủ sở hữuUserId = chưa được sắp xếp

Đây là 2 đầu vào không có thứ tự.

Tôi sẽ xem xét một chỉ mục trên bảng Bài viết trên Chủ sở hữuUserId, bao gồm Tiêu đề. Điều này sẽ thêm một số thứ tự ở một bên của đầu vào vào THAM GIA + nó sẽ bao gồm chỉ mục

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Sau đó, bạn có thể thấy rằng chỉ mục Users.DisplayName sẽ không được sử dụng và thay vào đó nó sẽ quét PK.


1
À, tôi hiểu rồi, tôi đang nghĩ về Users.DisplayName đã được PK yêu cầu, điều này không đúng. Bây giờ việc sử dụng Hash có ý nghĩa hơn đối với tôi. Cảm ơn!
Kyle Brandt

1
Bạn cũng có thể thử OPTION (FAST n)gợi ý, trong đó n là số lượng hàng thô bạn mong đợi. Điều này sẽ làm là thiên vị trình tối ưu hóa đối với các vòng lặp lồng nhau thay vì băm tham gia khi n thấp. Lý do là các phép nối băm nhanh cho các phép nối lớn nhưng có chi phí khởi động cao. Các vòng lặp lồng nhau là đắt tiền trên mỗi hàng, nhưng có thể bắt đầu rất rẻ. Vì vậy, đây là vấn đề tinh chỉnh dựa trên dữ liệu thực tế và mẫu truy cập của bạn.
Gaius

1
@Gaius: Cá nhân tôi muốn có chỉ mục hơn là gợi ý. Một gợi ý chỉ tốt cho truy vấn khi bạn thêm nó. Aka gợi ý trở thành một trách nhiệm theo thời gian. Các chỉ số có xu hướng hữu ích lâu hơn rất nhiều.
gbn

1
đó không phải là một hoặc hoặc một đề xuất :-)
Gaius

14

Từ http://sqlinthewild.co.za/index.php/2007/12/30/execut-plan-operations-joins/

"Tham gia băm là một trong những hoạt động tham gia đắt tiền hơn, vì nó yêu cầu tạo ra một bảng băm để thực hiện tham gia. Điều đó nói rằng, đó là sự tham gia tốt nhất cho các đầu vào lớn, chưa được sắp xếp. của các tham gia

Đầu tiên hàm băm đọc một trong các đầu vào và băm cột tham gia và đặt giá trị băm và cột kết quả vào một bảng băm được xây dựng trong bộ nhớ. Sau đó, nó đọc tất cả các hàng trong đầu vào thứ hai, băm các hàng đó và kiểm tra các hàng trong nhóm băm kết quả cho các hàng tham gia. "

liên kết đến bài viết này:

http://bloss.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH


Vì vậy, nếu đó chỉ là các trường id, tôi đoán tôi không hiểu lợi thế của việc băm một trường id?
Kyle Brandt

+1 cho liên kết đến blog của Craig Freedman, có nhiều bài viết tham gia hơn có sẵn: blog.msdn.com/b/craigfr/archive/tags/joins
Jeff

9

Ưu điểm của việc băm một trường số là bạn đang lấy một giá trị lớn hơn và chia nó thành các phần nhỏ hơn để nó có thể vừa với bảng băm.

Dưới đây là cách Grant Fritchey mô tả nó:

"Mặt khác, bảng băm là một cấu trúc dữ liệu phân chia tất cả các phần tử thành các loại hoặc xô có kích thước bằng nhau, để cho phép truy cập nhanh vào các phần tử. Hàm băm xác định nhóm phần tử nào đi vào. Ví dụ: , bạn có thể lấy một hàng từ bảng, băm nó thành giá trị băm, sau đó lưu giá trị băm vào bảng băm. "

Bạn cũng có thể nhận được một bản sao miễn phí của cuốn sách điện tử của mình "Phân tích kế hoạch thực thi máy chủ SQL" từ một liên kết từ bài viết sau:

Nguồn: http://www.simple-talk.com/sql/performance/graphical-execut-plans-for-simple-sql-queries/


Một loạt bài viết thú vị khác về THAM GIA
Jeff

Tôi đang làm việc theo cách của mình mặc dù Phân tích các Kế hoạch Thực thi Máy chủ SQL - thật tuyệt! Nhưng tôi đã có một chút bế tắc về điểm này :-P
Kyle Brandt

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.