Đây là phần cuối cùng của loạt bài 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. Phần 4 mô tả đồng bộ hóa trao đổi và khởi động các nhánh kế hoạch song song C &D.
Nhánh B Nhiệm vụ song song Bắt đầu
Lời nhắc về các nhánh trong kế hoạch song song này (bấm để phóng to):
Đây là giai đoạn thứ tư 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).
Chuỗi duy nhất đang hoạt động ngay bây giờ (không bị tạm ngừng trên CXPACKET
) là nhiệm vụ chính , nằm ở phía người tiêu dùng của luồng trao đổi phân vùng lại tại nút 11 ở Chi nhánh B:
Tác vụ mẹ hiện trả về từ giai đoạn đầu lồng nhau cuộc gọi, cài đặt đã trôi qua và thời gian CPU trong trình cấu hình khi nó diễn ra. Thời gian hoạt động đầu tiên và cuối cùng không được cập nhật trong quá trình xử lý giai đoạn đầu. Hãy nhớ rằng những con số này đang được ghi lại dựa trên ngữ cảnh thực thi bằng không - chưa tồn tại các tác vụ song song của Nhánh B.
Nhiệm vụ chính thăng thiên cây từ nút 11, thông qua luồng tổng hợp tại nút 10 và kết hợp hợp nhất tại nút 3, quay trở lại trao đổi luồng tập hợp tại nút 2.
Xử lý giai đoạn đầu hiện đã hoàn tất .
Với EarlyPhases
ban đầu gọi ở nút 2 thu thập luồng trao đổi cuối cùng đã hoàn thành, nhiệm vụ cha quay trở lại để mở trao đổi đó (bạn có thể chỉ cần nhớ cuộc gọi đó ngay từ đầu chuỗi này). Phương thức mở tại nút 2 bây giờ gọi CQScanExchangeNew::StartAllProducers
để tạo các tác vụ song song cho Chi nhánh B.
Nhiệm vụ chính bây giờ đang đợi trên CXPACKET
tại người tiêu dùng bên của nút 2 tập hợp các luồng đổi. Việc chờ đợi này sẽ tiếp tục cho đến khi các nhiệm vụ Nhánh B mới được tạo đã hoàn thành Open
lồng nhau của chúng gọi và quay lại để hoàn tất việc mở phía nhà sản xuất của trao đổi luồng thu thập.
Các tác vụ song song của nhánh B đang mở
Hai nhiệm vụ song song mới trong Nhánh B bắt đầu từ nhà sản xuất bên của nút 2 tập hợp các luồng đổi. Theo mô hình thực thi lặp lại chế độ hàng thông thường, chúng gọi:
-
CQScanXProducerNew::Open
(phía nhà sản xuất nút 2 đang mở). -
CQScanProfileNew::Open
(hồ sơ cho nút 3). -
CQScanMergeJoinNew::Open
(tham gia hợp nhất nút 3). -
CQScanProfileNew::Open
(hồ sơ cho nút 4). -
CQScanStreamAggregateNew::Open
(tổng hợp luồng nút 4). -
CQScanProfileNew::Open
(hồ sơ cho nút 5). -
CQScanExchangeNew::Open
(phân vùng lại luồng trao đổi).
Các tác vụ song song đều tuân theo đầu vào bên ngoài (phía trên) cho phép kết hợp, giống như quá trình xử lý giai đoạn đầu đã làm.
Hoàn tất quá trình trao đổi
Khi các nhiệm vụ Nhánh B đến người tiêu dùng bên của các luồng phân vùng lại trao đổi tại nút 5, mỗi tác vụ:
- Đăng ký với cổng trao đổi (
CXPort
). - Tạo đường ống (
CXPipe
) kết nối nhiệm vụ này với một hoặc nhiều nhiệm vụ phụ của nhà sản xuất (tùy thuộc vào loại trao đổi). Trao đổi hiện tại là một luồng phân chia lại, vì vậy mỗi tác vụ của người tiêu dùng có hai đường ống (tại DOP 2). Mỗi người tiêu dùng có thể nhận hàng từ một trong hai nhà sản xuất. - Thêm
CXPipeMerge
để hợp nhất hàng từ nhiều đường ống (vì đây là một trao đổi bảo toàn đơn đặt hàng). - Tạo gói hàng (có tên gây nhầm lẫn là
CXPacket
) được sử dụng để kiểm soát dòng chảy và để đệm các hàng trên các đường ống trao đổi. Chúng được cấp phát từ bộ nhớ truy vấn đã cấp trước đó.
Khi cả hai tác vụ song song phía người tiêu dùng đã hoàn thành, trao đổi nút 5 đã sẵn sàng hoạt động. Hai người tiêu dùng (ở Chi nhánh B) và hai nhà sản xuất (ở Chi nhánh C) đều đã mở cổng trao đổi, vì vậy nút 5 CXPACKET
chờ kết thúc .
Trạm kiểm soát
Như mọi thứ:
- Nhiệm vụ chính trong Nhánh A đang chờ đợi trên
CXPACKET
ở phía người tiêu dùng của nút 2 tập hợp các luồng trao đổi. Sự chờ đợi này sẽ tiếp tục cho đến khi cả hai nhà sản xuất nút 2 quay lại và mở sàn giao dịch. - Hai tác vụ song song trong Nhánh B có thể chạy được . Họ vừa mở phía người tiêu dùng của luồng trao đổi phân vùng lại tại nút 5.
- Hai tác vụ song song trong Nhánh C vừa được phát hành từ
CXPACKET
của họ đợi, và bây giờ có thể chạy được . Hai luồng tổng hợp tại nút 6 (một cho mỗi tác vụ song song) có thể bắt đầu tổng hợp các hàng từ hai loại tại nút 7. Nhớ lại các chỉ mục tìm kiếm tại nút 9 đã đóng một thời gian trước, khi các loại hoàn thành giai đoạn đầu vào của chúng. - Hai tác vụ song song trong Nhánh D đang chờ đợi trên
CXPACKET
ở 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 11. Họ đang đợi phía người tiêu dùng của nút 11 được mở bởi hai tác vụ song song trong Nhánh B. Chỉ mục tìm kiếm đã kết thúc và các loại đã sẵn sàng để chuyển sang giai đoạn đầu ra của họ.
Nhiều chi nhánh đang hoạt động
Đây là lần đầu tiên chúng tôi có nhiều chi nhánh (B và C) hoạt động cùng một lúc, điều này có thể là một thách thức để thảo luận. May mắn thay, thiết kế của truy vấn demo sao cho luồng tổng hợp trong Nhánh C sẽ chỉ tạo ra một vài hàng. Số lượng nhỏ các hàng đầu ra hẹp sẽ dễ dàng vừa với gói hàng bộ đệm tại nút 5 phân vùng lại các luồng trao đổi. Do đó, các nhiệm vụ Branch C có thể tiếp tục với công việc của chúng (và cuối cùng đóng lại) mà không cần đợi luồng phân vùng lại nút 5 phía người tiêu dùng tìm nạp bất kỳ hàng nào.
Thuận tiện, điều này có nghĩa là chúng ta có thể để hai tác vụ Branch C song song chạy trong nền mà không cần lo lắng về chúng. Chúng tôi chỉ cần quan tâm đến những gì hai nhiệm vụ song song của Nhánh B đang thực hiện.
Quá trình mở chi nhánh B hoàn tất
Nhắc nhở về Chi nhánh B:
Hai nhân viên song song trong Chi nhánh B trở về từ Open
của họ cuộc gọi tại nút 5 phân vùng lại luồng trao đổi. Điều này đưa chúng trở lại thông qua luồng tổng hợp tại nút 4, đến liên kết hợp nhất tại nút 3.
Bởi vì chúng tôi đang đi lên cây trong Open
, các trình cấu hình phía trên nút 5 và nút 4 đang ghi lại lần hoạt động cuối cùng thời gian, cũng như tích lũy thời gian đã trôi qua và CPU (mỗi tác vụ). Hiện tại, chúng tôi không thực hiện các giai đoạn đầu của tác vụ mẹ, vì vậy các số được ghi lại cho ngữ cảnh thực thi bằng 0 sẽ không bị ảnh hưởng.
Tại phép nối hợp nhất, hai tác vụ song song của Nhánh B bắt đầu giảm dần đầu vào bên trong (thấp hơn), đưa chúng qua luồng tổng hợp tại nút 10 (và một vài trình định cấu hình) đến phía người tiêu dùng của luồng phân vùng lại trao đổi tại nút 11.
Chi nhánh D tiếp tục thực thi
Sự lặp lại của các sự kiện Nhánh C tại nút 5 bây giờ xảy ra tại các luồng phân vùng lại của nút 11. Phía người tiêu dùng của sàn giao dịch nút 11 đã hoàn thành và mở. Hai nhà sản xuất ở Chi nhánh D kết thúc CXPACKET
của họ chờ đợi, trở nên có thể chạy được lần nữa. Chúng tôi sẽ để các nhiệm vụ Nhánh D chạy trong nền, đặt kết quả của chúng vào bộ đệm trao đổi.
Hiện có sáu tác vụ song song (hai trong mỗi Nhánh B, C và D) hợp tác chia sẻ thời gian trên hai bộ lập lịch được chỉ định cho các nhiệm vụ song song bổ sung trong truy vấn này.
Việc khai trương Chi nhánh A đã hoàn thành
Hai tác vụ song song trong Nhánh B trả về từ Open
của chúng lệnh gọi tại nút 11 trao đổi luồng phân vùng lại, vượt qua tổng hợp luồng của nút 10, thông qua liên kết hợp nhất tại nút 3 và quay lại phía nhà sản xuất của luồng thu thập tại nút 2. Hồ sơ hoạt động lần cuối và số lần tích lũy đã trôi qua &thời gian CPU được cập nhật khi chúng ta đi lên cây trong Open
lồng nhau các phương pháp.
Tại nhà sản xuất bên của trao đổi luồng tập hợp, hai tác vụ nhánh B song song đồng bộ hóa việc mở cổng trao đổi, sau đó đợi trên CXPACKET
cho phía người tiêu dùng để mở.
Nhiệm vụ chính chờ đợi từ phía người tiêu dùng của các luồng thu thập hiện đã được phát hành từ CXPACKET
của nó chờ đợi, điều này cho phép nó hoàn tất việc mở cổng trao đổi ở phía người tiêu dùng. Điều này lần lượt giải phóng các nhà sản xuất khỏi CXPACKET
(ngắn gọn) của họ Chờ đợi. Các luồng thu thập nút 2 hiện đã được mở bởi tất cả các chủ sở hữu.
Hoàn thành Quét Truy vấn
Nhiệm vụ chính bây giờ tăng cây quét truy vấn từ trao đổi luồng thu thập, trả về từ Open
cuộc gọi tại sàn giao dịch, phân đoạn và dự án trình tự các nhà khai thác trong Chi nhánh A.
Điều này hoàn thành mở cây quét truy vấn, đã khởi tạo tất cả điều đó trong khi trước đó bằng lệnh gọi tới CQueryScan::StartupQuery
. Tất cả các nhánh của kế hoạch song song hiện đã bắt đầu thực hiện.
Trả lại hàng
Kế hoạch thực thi đã sẵn sàng để bắt đầu trả về các hàng để phản hồi lại GetRow
cuộc gọi ở gốc của cây quét truy vấn, bắt đầu bằng lệnh gọi đến CQueryScan::GetRow
. Tôi sẽ không đi vào chi tiết đầy đủ, vì nó hoàn toàn nằm ngoài phạm vi của một bài viết về cách các kế hoạch song song khởi động .
Tuy nhiên, trình tự ngắn gọn là:
- Tác vụ mẹ gọi
GetRow
trên dự án trình tự, gọiGetRow
trên phân đoạn, gọiGetRow
trên người tiêu dùng phía bên của các luồng thu thập trao đổi. - Nếu không có hàng nào có sẵn tại sàn giao dịch, tác vụ chính đợi trên
CXCONSUMER
. - Trong khi đó, các tác vụ song song Branch B chạy độc lập đã được gọi một cách đệ quy
GetRow
bắt đầu từ nhà sản xuất phía bên của các luồng thu thập trao đổi. - Các hàng được cung cấp cho Chi nhánh B bởi các phía người tiêu dùng của các luồng phân vùng lại trao đổi tại các nút 5 và 12.
- Các nhánh C và D vẫn đang xử lý các hàng từ các loại của chúng thông qua tổng hợp luồng tương ứng của chúng. Các nhiệm vụ nhánh B có thể phải chờ trên
CXCONSUMER
tại các luồng phân vùng lại nút 5 và 12 để có một gói hàng hoàn chỉnh. - Các hàng xuất hiện từ
GetRow
lồng nhau các lệnh gọi trong Nhánh B được tập hợp thành các gói hàng tại nhà sản xuất phía bên của các luồng thu thập trao đổi. -
CXCONSUMER
của nhiệm vụ chính đợi ở phía người tiêu dùng khi luồng thu thập kết thúc khi có gói. - Một hàng tại một thời điểm sau đó được xử lý thông qua các toán tử chính trong Nhánh A và cuối cùng là đến máy khách.
- Cuối cùng, các hàng hết và một
Close
lồng nhau gọi gợn sóng xuống cây, trên các sàn giao dịch và quá trình thực hiện song song kết thúc.
Tóm tắt và Ghi chú Cuối cùng
Đầu tiên, tóm tắt về trình tự thực hiện của kế hoạch thực hiện song song cụ thể này:
- Công việc chính mở chi nhánh A . Giai đoạn đầu quá trình xử lý bắt đầu tại quá trình trao đổi luồng thu thập.
- Các lệnh gọi giai đoạn đầu của nhiệm vụ gốc đi xuống cây quét đến tìm kiếm chỉ mục tại nút 9, sau đó quay trở lại trao đổi phân vùng lại tại nút 5.
- Tác vụ chính bắt đầu các tác vụ song song cho Nhánh C , sau đó đợi trong khi họ đọc tất cả các hàng có sẵn vào các toán tử sắp xếp chặn tại nút 7.
- Các lệnh gọi giai đoạn đầu đi lên đến liên kết hợp nhất, sau đó đi xuống đầu vào bên trong đến trao đổi tại nút 11.
- Nhiệm vụ cho Chi nhánh D được bắt đầu giống như đối với Nhánh C, trong khi tác vụ mẹ đợi ở nút 11.
- Các cuộc gọi giai đoạn đầu quay trở lại từ nút 11 ở xa các luồng thu thập. Giai đoạn đầu kết thúc tại đây.
- Tác vụ chính tạo ra các tác vụ song song cho Nhánh B và đợi cho đến khi việc mở chi nhánh B hoàn tất.
- Nhiệm vụ nhánh B tiếp cận các luồng phân vùng lại nút 5, đồng bộ hóa, hoàn thành trao đổi và giải phóng các nhiệm vụ nhánh C để bắt đầu tổng hợp các hàng từ các loại.
- Khi các nhiệm vụ Nhánh B đạt đến luồng phân vùng lại nút 12, chúng sẽ đồng bộ hóa, hoàn tất quá trình trao đổi và giải phóng các nhiệm vụ Nhánh D để bắt đầu tổng hợp các hàng từ loại.
- Các tác vụ nhánh B quay trở lại các luồng thu thập trao đổi và đồng bộ hóa, giải phóng tác vụ mẹ khỏi sự chờ đợi của nó. Tác vụ chính hiện đã sẵn sàng để bắt đầu quá trình trả lại các hàng cho máy khách.
Bạn có thể muốn xem việc thực hiện kế hoạch này trong Sentry One Plan Explorer. Đảm bảo bật tùy chọn "Với hồ sơ truy vấn trực tiếp" của bộ sưu tập Kế hoạch thực tế. Điều thú vị khi thực hiện truy vấn trực tiếp trong Plan Explorer là bạn sẽ có thể thực hiện nhiều lần chụp theo tốc độ của riêng mình và thậm chí là tua lại. Nó cũng sẽ hiển thị một bản tóm tắt đồ họa của I / O, CPU và các lượt đợi được đồng bộ hóa với dữ liệu cấu hình truy vấn trực tiếp.
Ghi chú bổ sung
Tăng dần cây quét truy vấn trong quá trình xử lý pha sớm đặt thời gian hoạt động đầu tiên và cuối cùng tại mỗi trình lặp cấu hình cho tác vụ mẹ, nhưng không tích lũy thời gian đã trôi qua hoặc thời gian CPU. Tăng dần cây trong khi Open
và GetRow
lệnh gọi trên một tác vụ song song đặt thời gian hoạt động cuối cùng và tích lũy thời gian đã trôi qua và thời gian CPU tại mỗi trình lặp cấu hình cho mỗi tác vụ.
Xử lý giai đoạn đầu cụ thể cho các kế hoạch song song chế độ hàng. Cần đảm bảo các trao đổi được khởi tạo theo đúng thứ tự và tất cả các bộ máy song song hoạt động chính xác.
Tác vụ cha không phải lúc nào cũng thực hiện toàn bộ quá trình xử lý giai đoạn đầu. Các giai đoạn đầu bắt đầu từ một trao đổi gốc, nhưng cách các lệnh gọi đó điều hướng cây phụ thuộc vào các trình vòng lặp gặp phải. Tôi đã chọn liên kết hợp nhất cho bản trình diễn này vì nó yêu cầu xử lý giai đoạn sớm cho cả hai đầu vào.
Các pha ban đầu tại (ví dụ) một phép ghép băm song song chỉ truyền xuống đầu vào bản dựng. Khi tham gia băm chuyển sang giai đoạn thăm dò của nó, nó mở ra trình vòng lặp trên đầu vào đó, bao gồm bất kỳ trao đổi nào. Một vòng xử lý giai đoạn đầu khác được khởi tạo, xử lý bởi (chính xác) một trong các tác vụ song song, đóng vai trò của tác vụ mẹ.
Khi quá trình xử lý giai đoạn đầu gặp một nhánh song song có chứa trình vòng lặp chặn, nó sẽ bắt đầu các tác vụ song song bổ sung cho nhánh đó và đợi các nhà sản xuất đó hoàn thành giai đoạn mở đầu của họ. Nhánh đó cũng có thể có các nhánh con, được xử lý theo cùng một cách, đệ quy.
Một số nhánh trong kế hoạch song song ở chế độ hàng có thể được yêu cầu chạy trên một luồng duy nhất (ví dụ:do tổng hợp toàn cục hoặc trên cùng). Các ‘vùng nối tiếp’ này cũng chạy trên một nhiệm vụ ‘song song’ bổ sung, sự khác biệt duy nhất là chỉ có một tác vụ, ngữ cảnh thực thi và công nhân cho nhánh đó. Xử lý giai đoạn đầu hoạt động giống nhau bất kể số lượng nhiệm vụ được giao cho một nhánh. Ví dụ:‘khu vực nối tiếp’ báo cáo thời gian cho tác vụ mẹ (hoặc một tác vụ song song đóng vai trò đó) cũng như tác vụ bổ sung duy nhất. Điều này thể hiện trong showplan dưới dạng dữ liệu cho “luồng 0” (giai đoạn đầu) cũng như “luồng 1” (nhiệm vụ bổ sung).
Chốt lại những suy nghĩ
Tất cả điều này chắc chắn thể hiện thêm một lớp phức tạp. Lợi tức của khoản đầu tư đó là sử dụng tài nguyên thời gian chạy (chủ yếu là luồng và bộ nhớ), giảm thời gian chờ đồng bộ hóa, tăng thông lượng, số liệu hiệu suất có khả năng chính xác và giảm thiểu nguy cơ tắc nghẽn song song trong truy vấn.
Mặc dù chế độ hàng song song phần lớn đã bị che khuất bởi động cơ thực hiện chế độ hàng loạt hiện đại hơn, thiết kế chế độ hàng vẫn có một vẻ đẹp nhất định đối với nó. Hầu hết các trình lặp có thể giả vờ rằng họ vẫn đang chạy trong một kế hoạch nối tiếp, với hầu hết các hoạt động đồng bộ hóa, kiểm soát luồng và lập lịch do các sàn giao dịch xử lý. Sự cẩn thận và chú ý rõ ràng trong các chi tiết triển khai như xử lý giai đoạn đầu cho phép các kế hoạch song song lớn nhất có thể thực thi thành công mà không cần người thiết kế truy vấn phải suy nghĩ quá nhiều về những khó khăn thực tế.