Gói cứu trợ tổng hợp băm


10

Một câu hỏi phát sinh trong một cuộc thảo luận trò chuyện:

Tôi biết băm tham gia gói cứu trợ chuyển nội bộ sang một loại vòng lặp lồng nhau.

SQL Server làm gì cho gói cứu trợ tổng hợp băm (nếu nó có thể xảy ra)

Câu trả lời:


11

Cả băm tham giatổng hợp băm đều sử dụng cùng một mã toán tử bên trong, mặc dù một tổng hợp băm chỉ sử dụng một đầu vào (xây dựng) duy nhất. Hoạt động cơ bản của tổng hợp băm được mô tả bởi Craig Freedman :

Như với phép nối băm, tập hợp hàm băm yêu cầu bộ nhớ. Trước khi thực hiện truy vấn với tổng hợp băm, SQL Server sử dụng ước tính cardinality để ước tính dung lượng bộ nhớ chúng ta cần để thực hiện truy vấn. Với phép nối băm, chúng tôi lưu trữ từng hàng xây dựng, do đó, tổng yêu cầu bộ nhớ tỷ lệ thuận với số lượng và kích thước của các hàng xây dựng. Số lượng hàng tham gia và số lượng đầu ra của phép nối không ảnh hưởng đến yêu cầu bộ nhớ của phép nối. Với tổng hợp băm, chúng tôi lưu trữ một hàng cho mỗi nhóm, do đó, tổng yêu cầu bộ nhớ thực sự tỷ lệ thuận với số lượng và kích thước của các nhóm hoặc hàng đầu ra. Nếu chúng ta có ít giá trị duy nhất của nhóm theo cột và ít nhóm hơn, chúng ta cần ít bộ nhớ hơn. Nếu chúng ta có nhiều giá trị duy nhất của nhóm theo cột (s) và nhiều nhóm hơn, chúng ta cần nhiều bộ nhớ hơn.

Ông tiếp tục nói về đệ quy băm:

Vậy, điều gì xảy ra nếu chúng ta hết bộ nhớ? Một lần nữa, giống như tham gia băm, nếu chúng ta hết bộ nhớ, chúng ta phải bắt đầu đổ hàng vào tempdb. Chúng tôi làm đổ một hoặc nhiều nhóm hoặc phân vùng bao gồm mọi kết quả được tổng hợp một phần cùng với bất kỳ hàng mới bổ sung nào băm vào các thùng hoặc phân vùng bị đổ. Mặc dù chúng tôi không cố gắng tổng hợp các hàng mới bị đổ, chúng tôi sẽ băm chúng và chia chúng thành nhiều nhóm hoặc phân vùng. Khi chúng tôi đã xử lý xong tất cả các nhóm đầu vào, chúng tôi xuất các nhóm trong bộ nhớ đã hoàn thành và lặp lại thuật toán bằng cách đọc lại và tổng hợp một phân vùng bị đổ tại một thời điểm. Bằng cách chia các hàng bị đổ thành nhiều phân vùng, chúng tôi giảm kích thước của mỗi phân vùng và do đó, giảm rủi ro thuật toán sẽ cần lặp lại nhiều lần.

Giải cứu

Gói cứu trợ băm được ghi lại một cách nhẹ nhàng, nhưng được đề cập bởi Nacho Alonso Portillo trong phần Mức đệ quy tối đa cho trình lặp băm trước khi buộc giải cứu?

Giá trị là một hằng số, được mã hóa cứng trong sản phẩm và giá trị của nó là năm (5). Điều này có nghĩa là trước khi toán tử quét băm sử dụng thuật toán dựa trên sắp xếp cho bất kỳ phân nhóm cụ thể nào không phù hợp với bộ nhớ được cấp từ không gian làm việc, năm lần thử trước để chia phân vùng ban đầu thành các phân vùng nhỏ hơn đã xảy ra.

"Toán tử quét băm" được đề cập có một tham chiếu đến lớp bên CQScanHashtrong sqlmin.dll. Lớp này đứng đầu việc thực hiện toán tử băm (trong tất cả các dạng của nó, bao gồm các phần tổng hợp và dòng riêng biệt) mà chúng ta thấy trong các kế hoạch thực hiện.

Thuật toán giải cứu

Điều này đưa chúng tôi đến trung tâm của câu hỏi của bạn - chính xác thì thuật toán cứu trợ làm gì? Là "sắp xếp dựa trên" hay dựa trên "một loại vòng lặp lồng nhau"?

Nó được cho là cả hai, tùy thuộc vào quan điểm của bạn. Khi đệ quy băm đạt đến mức 5, phân vùng băm trong bộ nhớ sẽ thay đổi từ bảng băm thành chỉ mục b-cây trống ban đầu trên các giá trị băm. Mỗi hàng từ một phân vùng băm đơn được đổ trước đó được tra cứu trong chỉ mục b-cây và chèn (nhóm mới) hoặc cập nhật (duy trì tổng hợp) khi thích hợp.

Một loạt các phần chèn không có thứ tự vào một cây b cũng có thể được xem như là một kiểu chèn hoặc như một tra cứu các vòng lặp lồng nhau được lập chỉ mục.

Trong mọi trường hợp, thuật toán dự phòng này được đảm bảo hoàn thành cuối cùng mà không phân bổ thêm bộ nhớ. Nó có thể yêu cầu nhiều lượt đi nếu không gian có sẵn cho cây b không đủ để chứa tất cả các khóa nhóm và tập hợp từ phân vùng tràn.

Khi bộ nhớ khả dụng để giữ chỉ mục cây b đã hết, mọi hàng tiếp theo (từ phân vùng bị tràn hiện tại) sẽ được gửi đến một phân vùng tempdb mới (được đảm bảo nhỏ hơn) và quá trình lặp lại khi cần thiết. Mức tràn vẫn duy trì ở mức 5 vì đệ quy băm đã kết thúc. Một số chi tiết xử lý có thể được quan sát với cờ dấu vết 7357 không có giấy tờ.

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.