Đây là phần thứ tư trong loạt bài gồm năm phần đi sâu vào cách các kế hoạch song song của chế độ hàng SQL Server bắt đầu thực thi. Phần 1 khởi tạo ngữ cảnh thực thi bằng 0 cho tác vụ mẹ và phần 2 tạo cây quét truy vấn. Phần 3 bắt đầu quét truy vấn, thực hiện một số giai đoạn đầu xử lý và bắt đầu các tác vụ song song bổ sung đầu tiên trong nhánh C.
Chi tiết về việc thực thi Branch C
Đây là bước thứ hai của trình tự thực hiện:
- Nhánh A (nhiệm vụ chính).
- Nhánh C (các tác vụ song song bổ sung).
- Nhánh D (các tác vụ song song bổ sung).
- Nhánh B (các tác vụ song song bổ sung).
Nhắc nhở về các chi nhánh trong kế hoạch song song của chúng tôi (bấm để phóng to)
Một thời gian ngắn sau nhiệm vụ mới đối với nhánh C được xếp hàng đợi, SQL Server đính kèm một worker cho từng công việc và đặt nhân viên vào bộ lập lịch sẵn sàng để thực hiện. Mỗi tác vụ mới chạy bên trong một ngữ cảnh thực thi mới. Tại DOP 2, có hai tác vụ mới, hai luồng công nhân và hai ngữ cảnh thực thi cho nhánh C. Mỗi tác vụ chạy bản sao riêng của các trình vòng lặp trong nhánh C trên luồng công nhân của chính nó:
Hai tác vụ song song mới bắt đầu chạy tại một thủ tục phụ điểm vào, ban đầu dẫn đến Open
gọi cho phía nhà sản xuất của sàn giao dịch (CQScanXProducerNew::Open
). Cả hai tác vụ đều có ngăn xếp cuộc gọi giống hệt nhau khi bắt đầu cuộc sống của chúng:
Đồng bộ hóa trao đổi
Trong khi đó, tác vụ chính (chạy trên chuỗi công nhân của chính nó) đăng ký các quy trình phụ mới với trình quản lý quy trình phụ, sau đó đợi ở phía người tiêu dùng trao đổi luồng phân vùng lại tại nút 5. Tác vụ mẹ chờ trên CXPACKET
* cho đến khi tất cả của nhánh C các nhiệm vụ song song hoàn thành Open
gọi và quay lại phía nhà sản xuất của sàn giao dịch. Các tác vụ song song sẽ mở mọi trình lặp trong cây con của chúng (tức là xuống tìm kiếm chỉ mục tại nút 9 và trở lại) trước khi quay lại trao đổi luồng phân vùng lại tại nút 5. Tác vụ mẹ sẽ đợi trên CXPACKET
trong khi điều này xảy ra. Hãy nhớ rằng tác vụ mẹ đang thực hiện các lệnh gọi giai đoạn đầu.
Chúng ta có thể thấy sự chờ đợi này trong các nhiệm vụ đang chờ DMV:
Không ngữ cảnh thực thi (tác vụ mẹ) bị chặn bởi cả hai ngữ cảnh thực thi mới. Các bối cảnh thực thi này là những cái bổ sung đầu tiên được tạo sau ngữ cảnh 0, vì vậy chúng được gán các số một và hai. Cần nhấn mạnh:Cả hai ngữ cảnh thực thi mới đều cần mở các cây con của chúng và quay lại trao đổi cho CXPACKET
của tác vụ mẹ đợi để kết thúc.
Bạn có thể đã mong đợi để xem CXCONSUMER
đợi ở đây, nhưng sự chờ đợi đó được dành riêng cho việc đợi trên dữ liệu hàng đến. Sự chờ đợi hiện tại không dành cho hàng - đó là để phía nhà sản xuất mở , vì vậy chúng tôi nhận được một CXPACKET
chung * đợi đã.
* Cơ sở dữ liệu Azure SQL và Phiên bản được quản lý sử dụng CXSYNC_PORT
mới đợi thay vì CXPACKET
ở đây, nhưng cải tiến đó vẫn chưa được đưa vào SQL Server (kể từ CU9 2019).
Kiểm tra các nhiệm vụ song song mới
Chúng tôi có thể thấy các nhiệm vụ mới trong cấu hình truy vấn DMV. Thông tin cấu hình cho các nhiệm vụ mới xuất hiện trong DMV vì ngữ cảnh thực thi của chúng được lấy (sao chép, sau đó cập nhật) từ nguồn gốc (ngữ cảnh thực thi bằng không):
Bây giờ có ba mục nhập cho mỗi trình lặp trong Nhánh C (được đánh dấu). Một cho tác vụ mẹ (không ngữ cảnh thực thi) và một cho mỗi tác vụ song song bổ sung mới (ngữ cảnh 1 và 2). Lưu ý rằng số hàng ước tính trên mỗi luồng (xem phần 1) hiện đã đến và chỉ được hiển thị cho các tác vụ song song. thời gian hoạt động đầu tiên và cuối cùng đối với các tác vụ song song đại diện cho thời gian các bối cảnh thực thi của chúng được tạo. Không có nhiệm vụ mới nào đã mở bất kỳ trình vòng lặp nào.
Luồng phân vùng lại trao đổi tại nút 5 vẫn chỉ có một mục duy nhất trong đầu ra DMV. Điều này là do hồ sơ vô hình được liên kết giám sát người tiêu dùng bên của sàn giao dịch. Các nhiệm vụ song song bổ sung thuộc về nhà sản xuất bên của sàn giao dịch. Phía người tiêu dùng của nút 5 sẽ cuối cùng có các nhiệm vụ song song, nhưng chúng tôi vẫn chưa hoàn thành nhiệm vụ đó.
Trạm kiểm soát
Đây có vẻ là một điểm tốt để dừng lại và tóm tắt mọi thứ ở thời điểm hiện tại. Sẽ còn nhiều điểm dừng nữa khi chúng ta tiếp tục.
- Công việc chính thuộc về phía người tiêu dùng trao đổi luồng phân vùng lại tại nút 5 , đang đợi trên
CXPACKET
. Nó đang ở giữa việc thực hiện các lệnh gọi giai đoạn đầu. Nó tạm dừng để khởi động Nhánh C vì nhánh đó chứa một loại chặn. Việc chờ đợi của nhiệm vụ chính sẽ tiếp tục cho đến khi cả hai nhiệm vụ song song hoàn thành, mở các nhiệm vụ phụ của chúng. - Hai tác vụ song song mới về phía nhà sản xuất của nút 5 trao đổi đã sẵn sàng để mở các trình vòng lặp trong Nhánh C.
Không có gì bên ngoài Nhánh C của kế hoạch thực thi song song này có thể đạt được tiến độ cho đến khi tác vụ mẹ được giải phóng khỏi CXPACKET
của nó Chờ đợi. Hãy nhớ rằng chúng tôi mới chỉ tạo một tập hợp các nhân viên song song bổ sung cho đến nay, cho Chi nhánh C. Chuỗi còn lại duy nhất là tác vụ chính và đã bị chặn.
Thực thi Song song Nhánh C
Hai tác vụ song song bắt đầu ở phía nhà sản xuất của các luồng phân vùng lại trao đổi tại nút 5. Mỗi luồng có một kế hoạch (nối tiếp) riêng biệt với tổng hợp luồng, sắp xếp và tìm kiếm chỉ mục riêng của nó. Tính toán vô hướng không xuất hiện trong kế hoạch thời gian chạy bởi vì các phép tính của nó được trì hoãn theo kiểu sắp xếp.
Mỗi phiên bản của tìm kiếm chỉ mục là nhận biết song song và hoạt động trên các tập hợp hàng rời rạc. Các tập hợp này được tạo theo yêu cầu từ tập các hàng mẹ đã được tác vụ mẹ tạo trước đó (được đề cập trong phần 1). Khi một trong hai trường hợp của tìm kiếm cần một dải con mới của các hàng, nó sẽ đồng bộ hóa với các luồng công nhân khác, để chỉ một trong hai phân bổ một dải con mới cùng một lúc. Đối tượng đồng bộ hóa được sử dụng cũng đã được tạo trước đó bởi tác vụ mẹ. Khi một tác vụ chờ quyền truy cập độc quyền vào bộ hàng mẹ để có được dải con mới, nó sẽ đợi trên CXROWSET_SYNC
.
Nhiệm vụ nhánh C đang mở
Chuỗi Open
lệnh gọi cho mỗi nhiệm vụ trong Nhánh C là:
-
CQScanXProducerNew::Open
. Lưu ý rằng không có trình mô tả trước ở phía nhà sản xuất của một cuộc trao đổi. Điều này thật không may cho những người điều chỉnh truy vấn. -
CXTransLocal::Open
-
CXPort::Register
-
CXTransLocal::ActivateWorkers
-
CQScanProfileNew::Open
. Hồ sơ ở trên nút 6. -
CQScanStreamAggregateNew::Open
(nút 6) -
CQScanProfileNew::Open
. Hồ sơ bên trên nút 7. -
CQScanSortNew::Open
(nút 7)
Sắp xếp là một toán tử chặn hoàn toàn . Nó sử dụng toàn bộ dữ liệu đầu vào trong quá trình Open
gọi điện. Có rất nhiều chi tiết nội bộ thú vị để khám phá ở đây, nhưng không gian ngắn, vì vậy tôi sẽ chỉ trình bày những điểm nổi bật:
Sắp xếp xây dựng bảng sắp xếp của nó bằng cách mở cây con của nó và sử dụng tất cả các hàng con của nó có thể cung cấp. Sau khi sắp xếp xong, quá trình sắp xếp đã sẵn sàng để chuyển sang chế độ đầu ra và nó trả lại quyền kiểm soát cho cha mẹ của nó. Sắp xếp sau này sẽ phản hồi với GetRow()
các cuộc gọi, trả về hàng được sắp xếp tiếp theo mỗi lần. Ngăn xếp cuộc gọi minh họa trong quá trình nhập sắp xếp là:
Việc thực thi tiếp tục cho đến khi mỗi loại đã sử dụng tất cả các hàng (phạm vi riêng biệt) có sẵn từ tìm kiếm chỉ mục con của nó . Các loại sau đó gọi Close
trên tìm kiếm chỉ mục và trả lại quyền kiểm soát cho luồng tổng hợp chính của chúng . Luồng tổng hợp khởi tạo bộ đếm của họ và trả lại quyền kiểm soát cho nhà sản xuất bên trao đổi phân vùng lại tại nút 5. Trình tự Open
các cuộc gọi hiện đã hoàn tất trong nhánh này.
DMV cấu hình tại thời điểm này hiển thị số thời gian được cập nhật và thời gian đóng đối với tìm kiếm chỉ mục song song:
Đồng bộ hóa trao đổi khác
Nhắc lại tác vụ mẹ đang chờ người tiêu dùng bên của nút 5 để tất cả các nhà sản xuất mở. Quá trình đồng bộ hóa tương tự hiện xảy ra giữa các tác vụ song song trên nhà sản xuất mặt của cùng một sàn giao dịch:
Mỗi tác vụ của nhà sản xuất sẽ đồng bộ hóa với những tác vụ khác qua CXTransLocal::Synchronize
. Các nhà sản xuất gọi CXPort::Open
, sau đó đợi trên CXPACKET
cho tất cả phía người tiêu dùng nhiệm vụ song song để mở. Khi nhiệm vụ song song Nhánh C đầu tiên quay trở lại phía nhà sản xuất của trao đổi và đợi, các tác vụ chờ DMV trông giống như sau:
Chúng tôi vẫn có sự chờ đợi từ phía người tiêu dùng của nhiệm vụ chính. CXPACKET
mới được đánh dấu là nhiệm vụ song song phía nhà sản xuất đầu tiên của chúng tôi đang chờ tất cả các tác vụ song song phía người tiêu dùng để mở cổng trao đổi.
Các tác vụ song song phía người tiêu dùng (trong Nhánh B) thậm chí còn chưa tồn tại, vì vậy tác vụ nhà sản xuất hiển thị NULL cho ngữ cảnh thực thi mà nó bị chặn. Tác vụ hiện đang chờ đợi ở phía người tiêu dùng của trao đổi luồng phân vùng lại là tác vụ mẹ (không phải tác vụ song song!) Đang chạy EarlyPhases
mã, vì vậy nó không được tính.
Việc chờ đợi CXPACKET của nhiệm vụ chính kết thúc
Khi thứ hai nhiệm vụ song song trong Chi nhánh C quay trở lại phía nhà sản xuất của trao đổi từ Open
của nó cuộc gọi, tất cả các nhà sản xuất đã mở cổng trao đổi, vì vậy nhiệm vụ chính về phía người tiêu dùng của sàn giao dịch được phát hành từ CXPACKET
của nó đợi đã.
Các công nhân phía nhà sản xuất tiếp tục đợi các tác vụ song song của phía người tiêu dùng được tạo và mở cổng trao đổi:
Trạm kiểm soát
Tại thời điểm này:
- Có tổng cộng ba nhiệm vụ:Hai trong Nhánh C, cộng với nhiệm vụ chính.
- Cả nhà sản xuất tại nút 5 trao đổi đã mở và đang chờ trên
CXPACKET
để mở các tác vụ song song phía người tiêu dùng. Phần lớn máy móc trao đổi (bao gồm cả bộ đệm hàng) được tạo ra bởi phía người tiêu dùng, do đó, người sản xuất chưa có chỗ nào để đặt hàng. - Các loại ở Chi nhánh C đã tiêu thụ tất cả đầu vào của họ và sẵn sàng cung cấp đầu ra đã được sắp xếp.
- Chỉ mục tìm kiếm ở Chi nhánh C đã hoàn thành công việc của họ và đóng cửa.
- Công việc chính vừa được phát hành khỏi phải chờ trên
CXPACKET
ở phía người tiêu dùng của sự trao đổi luồng phân vùng lại nút 5. Nó vẫn còn thực thiEarlyPhases
lồng nhau cuộc gọi.
Nhánh D Nhiệm vụ Song song Bắt đầu
Đây là bước thứ ba trong trình tự thực hiện:
- Nhánh A (nhiệm vụ chính).
- Nhánh C (các tác vụ song song bổ sung).
- Nhánh D (các tác vụ song song bổ sung).
- Nhánh B (các tác vụ song song bổ sung).
Được phát hành từ CXPACKET
của nó đợi ở phía người tiêu dùng của luồng phân vùng lại trao đổi tại nút 5, tác vụ chính thăng thiên cây quét truy vấn Nhánh B. Nó trả về từ EarlyPhases
lồng nhau lệnh gọi đến các trình vòng lặp và trình cấu hình khác nhau ở đầu vào bên ngoài (phía trên) của phép nối hợp nhất.
Như đã đề cập, tăng dần cây cập nhật thời gian đã trôi qua và thời gian CPU được ghi lại bởi các trình vòng lặp cấu hình vô hình. Chúng tôi đang thực thi mã bằng tác vụ mẹ, vì vậy những con số đó được ghi lại dựa trên ngữ cảnh thực thi bằng không. Đây là nguồn cuối cùng của số thời gian “chuỗi 0” được đề cập trong bài viết trước của tôi, Tìm hiểu về thời gian của người điều hành kế hoạch thực thi.
Khi trở lại kết hợp hợp nhất, tác vụ mẹ gọi EarlyPhases
cho các trình vòng lặp và trình phân tích ở đầu vào bên trong (thấp hơn) của phép nối hợp nhất. Đây là nút 10 đến 15 (không bao gồm 14, được hoãn lại):
Khi các lệnh gọi giai đoạn đầu của nhiệm vụ mẹ đạt đến tìm kiếm chỉ mục tại nút 15, nó bắt đầu đi lên cây một lần nữa (thiết lập thời gian lập hồ sơ) cho đến khi đạt đến các luồng phân vùng lại trao đổi tại nút 11.
Sau đó, giống như đã làm ở đầu vào bên ngoài (phía trên) của phép nối hợp nhất, nó bắt đầu phía nhà sản xuất của sàn giao dịch tại nút 11 , tạo hai tác vụ song song mới .
Điều này đặt Nhánh D chuyển động (hiển thị bên dưới). Nhánh D thực thi chính xác như đã được mô tả chi tiết cho Nhánh C.
Ngay sau khi bắt đầu tác vụ cho Nhánh D, tác vụ mẹ sẽ đợi trên CXPACKET
tại nút 11 để các nhà sản xuất mới mở cổng trao đổi:
CXPACKET
mới chờ đợi được đánh dấu. Lưu ý rằng id nút được báo cáo có thể hơi sai lệch. Tác vụ mẹ thực sự đang đợi ở phía người tiêu dùng của nút 11 (các luồng phân vùng lại), không phải nút 2 (tập hợp các luồng). Đây là một sai lầm của xử lý giai đoạn đầu.
Trong khi đó, các chuỗi nhà sản xuất trong Nhánh C tiếp tục chờ trên CXPACKET
để mở trao đổi luồng phân vùng lại phía người tiêu dùng của nút 5.
Khai trương Chi nhánh D
Ngay sau khi nhiệm vụ chính bắt đầu các nhà sản xuất cho Nhánh D, hồ sơ truy vấn DMV hiển thị các ngữ cảnh thực thi mới (3 và 4):
hai nhiệm vụ song song mới trong Chi nhánh D tiến hành chính xác như những gì trong Chi nhánh C đã làm. Các loại tiêu thụ tất cả dữ liệu đầu vào của chúng và các nhiệm vụ của Chi nhánh D quay trở lại sàn giao dịch. Điều này giải phóng tác vụ mẹ khỏi CXPACKET
của nó Chờ đợi. Các công nhân của Chi nhánh D sau đó chờ trên CXPACKET
ở phía nhà sản xuất của nút 11 để mở các tác vụ song song phía người tiêu dùng. Những công nhân song song đó (ở Chi nhánh B) vẫn chưa tồn tại.
Trạm kiểm soát
Các nhiệm vụ đang chờ đợi tại thời điểm này được hiển thị bên dưới:
Cả hai nhóm tác vụ song song trong Nhánh C và D đang chờ trên CXPACKET
để người tiêu dùng tác vụ song song của họ mở, tại các luồng phân vùng lại trao đổi các nút 5 và 11 tương ứng. Tác vụ duy nhất có thể chạy trong toàn bộ truy vấn ngay bây giờ là nhiệm vụ chính .
Hồ sơ truy vấn DMV tại thời điểm này được hiển thị bên dưới, với các toán tử trong Nhánh C và D được đánh dấu:
Các nhiệm vụ song song duy nhất mà chúng tôi chưa bắt đầu là ở Chi nhánh B. Tất cả công việc ở Chi nhánh B cho đến nay đều là giai đoạn đầu các lệnh gọi được thực hiện bởi tác vụ chính .
Kết thúc Phần 4
Trong phần cuối của loạt bài này, tôi sẽ mô tả cách phần còn lại của kế hoạch thực thi song song cụ thể này bắt đầu như thế nào và trình bày ngắn gọn cách kế hoạch trả về kết quả. Tôi sẽ kết thúc bằng một mô tả chung hơn áp dụng cho các kế hoạch song song có độ phức tạp tùy ý.