Trong SQL Server, Parallelism thay đổi cấp bộ nhớ như thế nào?


9

Tôi đã nghe những điều mâu thuẫn về việc cấp bộ nhớ cho các truy vấn chọn song song:

  • Cấp bộ nhớ được nhân với DOP
  • Cấp bộ nhớ được chia cho DOP

Đó là cái gì

Câu trả lời:


10

Sup?

Đối với các truy vấn SQL Server yêu cầu bộ nhớ bổ sung, các khoản trợ cấp được lấy từ các gói nối tiếp. Nếu một kế hoạch song song được khám phá và chọn, bộ nhớ sẽ được chia đều cho các luồng.

Ước tính cấp bộ nhớ được dựa trên:

  • Số lượng hàng (cardinality)
  • Kích thước của hàng (kích thước dữ liệu)
  • Số lượng toán tử tiêu thụ bộ nhớ đồng thời

Nếu một kế hoạch song song được chọn, có một số chi phí bộ nhớ để xử lý các trao đổi song song (phân phối, phân phối lại và thu thập các luồng), tuy nhiên nhu cầu bộ nhớ của chúng vẫn không được tính theo cùng một cách.

Toán tử tiêu thụ bộ nhớ

Các toán tử phổ biến nhất yêu cầu bộ nhớ là

  • Sắp xếp
  • Băm (tham gia, tổng hợp)
  • Vòng lặp lồng tối ưu hóa

Các toán tử ít phổ biến hơn yêu cầu bộ nhớ được chèn vào các chỉ mục lưu trữ cột. Những điều này cũng khác nhau ở chỗ các khoản trợ cấp bộ nhớ hiện đang được nhân với DOP cho chúng.

Nhu cầu bộ nhớ cho Sắp xếp thường cao hơn nhiều so với băm. Sắp xếp sẽ yêu cầu kích thước dữ liệu ít nhất ước tính cho cấp bộ nhớ, vì chúng cần sắp xếp tất cả các cột kết quả theo (các) phần tử đặt hàng. Băm cần bộ nhớ để xây dựng bảng băm, không bao gồm tất cả các cột được chọn.

Ví dụ

Nếu tôi chạy truy vấn này, cố ý gợi ý đến DOP 1, nó sẽ yêu cầu 166 MB bộ nhớ.

SELECT *
FROM 
     (  
        SELECT TOP (1000) 
               u.Id 
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u
OPTION(MAXDOP 1);

QUẢ HẠCH

Nếu tôi chạy truy vấn này (một lần nữa, DOP 1), gói sẽ thay đổi và cấp bộ nhớ sẽ tăng lên một chút.

SELECT *
FROM (  
        SELECT TOP (1000) 
               u.Id
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u
JOIN (
        SELECT TOP (1000) 
               u.Id
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u2
ON u.Id = u2.Id
OPTION(MAXDOP 1);

QUẢ HẠCH

Có hai Sắp xếp, và bây giờ là Hash Tham gia. Cấp bộ nhớ tăng lên một chút để phù hợp với bản dựng băm, nhưng nó không tăng gấp đôi vì các toán tử Sắp xếp không thể chạy đồng thời.

Nếu tôi thay đổi truy vấn để buộc tham gia các vòng lặp lồng nhau, cấp sẽ tăng gấp đôi để xử lý các Sắp xếp đồng thời.

SELECT *
FROM (  
        SELECT TOP (1000) 
               u.Id
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u
INNER LOOP JOIN ( --Force the loop join
        SELECT TOP (1000) 
               u.Id
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u2
ON u.Id = u2.Id
OPTION(MAXDOP 1);

QUẢ HẠCH

Cấp bộ nhớ tăng gấp đôi vì Nested Loop không phải là toán tử chặn và Hash Join là.

Kích thước của vấn đề dữ liệu

Truy vấn này chọn dữ liệu chuỗi của các kết hợp khác nhau. Tùy thuộc vào cột nào tôi chọn, kích thước của cấp bộ nhớ sẽ tăng lên.

Kích thước của dữ liệu được tính cho dữ liệu chuỗi biến là các hàng * 50% chiều dài khai báo của cột. Điều này đúng với VARCHAR và NVARCHAR, mặc dù các cột NVARCHAR được nhân đôi vì chúng lưu trữ các ký tự hai byte. Điều này không thay đổi trong một số trường hợp với CE mới, nhưng chi tiết không được ghi lại.

Kích thước của dữ liệu cũng quan trọng đối với các hoạt động băm, nhưng không ở cùng mức độ đối với Sắp xếp.

SELECT *
FROM 
     (  
        SELECT TOP (1000) 
                 u.Id          -- 166MB (INT)
               , u.DisplayName -- 300MB (NVARCHAR 40)
               , u.WebsiteUrl  -- 900MB (NVARCHAR 200)
               , u.Location    -- 1.2GB (NVARCHAR 100)
               , u.AboutMe     -- 9GB   (NVARCHAR MAX)
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u
OPTION(MAXDOP 1);

Nhưng những gì về song song?

Nếu tôi chạy truy vấn này ở các DOP khác nhau, cấp bộ nhớ sẽ không được nhân với DOP.

SELECT *
FROM (  
        SELECT TOP (1000) 
               u.Id
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u
INNER HASH JOIN (
        SELECT TOP (1000) 
               u.Id
        FROM dbo.Users AS u
        ORDER BY u.Reputation
     ) AS u2
ON u.Id = u2.Id
ORDER BY u.Id, u2.Id -- Add an ORDER BY
OPTION(MAXDOP ?);

QUẢ HẠCH

Có sự gia tăng nhẹ để xử lý nhiều bộ đệm song song hơn trên mỗi toán tử trao đổi và có lẽ có những lý do bên trong rằng các bản dựng Sắp xếp và Hash yêu cầu thêm bộ nhớ để xử lý DOP cao hơn, nhưng rõ ràng đó không phải là một yếu tố nhân.

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.