Thông tin tham khảo về việc thực thi truy vấn

Trang này giải thích kết quả của một truy vấn được thực thi bằng Query Explain. Để tìm hiểu cách thực thi một truy vấn bằng Query Explain, hãy xem phần Phân tích quá trình thực thi truy vấn bằng Query Explain.

Khái niệm thường gặp

Các khái niệm và thuật ngữ phổ biến sau đây được dùng trong toàn bộ cây thực thi.

Hàng và bản ghi

Các thuật ngữ hàngbản ghi được dùng để chỉ chung một tài liệu hoặc mục nhập chỉ mục.

Biến

$ biểu thị một biến được tạo hoặc tham chiếu trong cây thực thi. Ví dụ: $foo_1. Các biến này thường được dùng để tham chiếu đến nội dung của một tài liệu hoặc giá trị của một biểu thức được đánh giá trong quá trình thực thi một truy vấn.

Các biến nội bộ sau đây có thể xuất hiện trong các nút thực thi:

  • $__key__ – khoá là giá trị nhận dạng nội bộ cho một tài liệu. Đây là giá trị nhận dạng tuyệt đối, duy nhất của dự án, cơ sở dữ liệu và đường dẫn đầy đủ của tài liệu.
  • $__id__ – mã nhận dạng là giá trị nhận dạng riêng biệt của một tài liệu trong bộ sưu tập. Giá trị này là duy nhất trong một bộ sưu tập.

Hãy xem xét một ví dụ trong đó nút Compute được dùng để tính toán __id__ từ __key__ của tài liệu:

Compute
    |  $__id__1: _id($__key__)
    |  records returned: 1

Ràng buộc và phạm vi

Một số nút quét sử dụng các thuộc tính constraintsranges để mô tả dải giá trị được quét. Các thuộc tính này sử dụng định dạng cây phạm vi chứa một danh sách giá trị. Các giá trị này tương ứng với danh sách khoá theo thứ tự xuất hiện trong định nghĩa chỉ mục. Ví dụ: dải ô đầu tiên xuất hiện trong cây, ở đây là (1..5], tương ứng với các ràng buộc trên khoá đầu tiên, ở đây là a, trong danh sách khoá có thứ tự:

| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
               |----(1..5]
                    |----[1L]

Mỗi cấp thụt lề cho biết ràng buộc áp dụng cho khoá tiếp theo trong danh sách. Dấu ngoặc vuông biểu thị một phạm vi bao gồm, dấu ngoặc tròn là một phạm vi loại trừ. Trong trường hợp này, ràng buộc sẽ chuyển thành 1 < "a" <= 5"b" = 1.

Trong ví dụ sau có nhiều nhánh cho a, điều kiện ràng buộc tương ứng với 1 < a <= 5 OR a = 10:

| constraints: /
               |----(1L, 5L]
               |----[10L]

Biến chính

Trong một số nút quét (chẳng hạn như SequentialScan), có cả danh sách khoá trong thuộc tính index và một thuộc tính keys riêng biệt trong nút Scan. Thuộc tính keys trong nút Scan biểu thị tên biến của từng khoá trong định nghĩa chỉ mục, theo thứ tự. Bạn có thể dùng các biến để tham chiếu các giá trị thời gian chạy của trường được quét ở phía trên trong cây thực thi.

Trong ví dụ sau, giá trị của trường user cho tài liệu hiện tại sẽ ánh xạ đến biến $user_1 và giá trị của date_placed đến $date_placed_1.

index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __key__ ASC]
keys: [user ASC, date_placed ASC, __key__ ASC]

Nút thực thi

Cây thực thi truy vấn có thể chứa các nút sau.

SeekingScan

Biểu thị một lượt quét động, trong đó các hàng được trả về có thể không nằm trong một dải chỉ mục tuần tự duy nhất và phải thực hiện nhiều lượt quét riêng biệt để đáp ứng truy vấn.

Ví dụ: một truy vấn trong đó a tồn tại và b bằng 1 hoạt động trên chỉ mục của ["a" ASC, "b" ASC], sẽ cần quét và trả về một phạm vi riêng biệt, có thể không tuần tự cho từng giá trị riêng biệt của a. Cách này hiệu quả hơn một TableScan đầy đủ, nhưng kém hiệu quả hơn một SequentialScan duy nhất trên một chỉ mục kết hợp của ["b" ASC, "a" ASC].

• SeekingScan
| constraints: /
               |----(-∞..+∞)
                    |----[1L]
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, quantity ASC, __key__ ASC]
| keys: [user ASC, quantity ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1

SequentialScan

Biểu thị một lượt quét một dải ô tĩnh, tuần tự của các hàng trong bộ nhớ có thể được thực hiện trong một thao tác đọc duy nhất.

key ordering length đề cập đến số lượng khoá phải được giữ lại và trả về theo thứ tự khoá ban đầu. Đối với một giản đồ [k1, k2, k3], độ dài sắp xếp khoá là 0 có nghĩa là quá trình quét có thể trả về theo bất kỳ thứ tự nào, 1 có nghĩa là sắp xếp theo k1, nhưng các hàng có cùng giá trị k1 có thể xuất hiện theo bất kỳ thứ tự nào, 3 trả về các tài liệu theo thứ tự sắp xếp chính xác.

• SequentialScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| key ordering length: 3
| keys: [user ASC, date_placed ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1

UniqueScan

Biểu thị một lượt quét một dải ô tĩnh, tuần tự trong bộ nhớ có tính năng loại bỏ các hàng trùng lặp trong bộ nhớ.

• UniqueScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| keys: [user ASC, date_placed ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
          |----(-∞..+∞)
| records returned: 1
| records scanned: 1

TableAccess

Kết hợp ngược mã nhận dạng của hàng được cung cấp với nội dung thực tế của hàng từ bộ nhớ chính. TableAccess là bắt buộc nếu một nút mẹ (hoặc kết quả truy vấn cuối cùng) yêu cầu một tập hợp con các trường trong tài liệu.

• TableAccess
|  order: PRESERVE_INPUT_ORDER
|  peak memory usage: 4.00 KiB (4,096 B)
|  properties: *
|  records returned: 1

LookupById

Thực hiện thao tác kết hợp bằng cách tra cứu các tài liệu trong một bộ sưu tập bên ngoài theo mã nhận dạng của chúng. Các mã nhận dạng cần tra cứu được lấy từ một trường trong tài liệu đầu vào. Kết quả của thao tác tra cứu sẽ được thêm dưới dạng một trường mới vào các tài liệu đầu vào.

• LookupById
|  local_field: $localField_1
|  foreign_datasource: (default)#/**/foreign
|  output: $output_1

TableScan

Quá trình quét toàn bộ, không theo thứ tự của một bộ sưu tập. Được dùng khi một truy vấn chạy mà không có chỉ mục liên kết.

Thứ tự có thể là STABLE hoặc UNDEFINED, trong đó STABLE biểu thị thứ tự xác định.

• TableScan
|  order: STABLE
|  properties: *
|  records returned: 1
|  records scanned: 1
|  source: (default)#/**/collection

HashAggregate

Triển khai dựa trên hàm băm của các thao tác tổng hợp. Yêu cầu hiện thực hoá toàn bộ nhóm trong bộ nhớ trước khi trả về kết quả và không được vượt quá giới hạn bộ nhớ truy vấn.

• HashAggregate
|  aggregations: [sum($b_1) AS total]
|  groups: [$a_1]
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 0

StreamAggregate

Nút tổng hợp chuyên biệt chỉ duy trì trạng thái cho một nhóm tại một thời điểm, giảm mức sử dụng bộ nhớ cao nhất. Được dùng khi nút con cơ bản sẽ trả về các nhóm theo trình tự. Ví dụ: khi nhóm theo các giá trị riêng biệt của một trường trong khi sử dụng chỉ mục trên trường đó.

• StreamAggregate
|  keys: [foo ASC, bar ASC]
|  properties: Selection { baz }
|  aggregations: [$sum($foo_1) AS baz]

MajorSort

Thực hiện thao tác sắp xếp trên một nhóm thuộc tính cố định. Hiện thực hoá tất cả các bản ghi trong bộ nhớ cùng một lúc và trả về các giá trị đã sắp xếp theo thứ tự, kích thước của tập hợp sắp xếp bị giới hạn bởi hạn mức bộ nhớ truy vấn.

Khi một giới hạn tiếp theo được cung cấp, thuật toán sắp xếp k hàng đầu sẽ được dùng để giảm mức sử dụng bộ nhớ. Với thuật toán này, bạn có thể sắp xếp một tập hợp bản ghi có kích thước tuỳ ý miễn là bộ nhớ dùng để lưu trữ k phần tử được xem xét không vượt quá giới hạn.

• MajorSort
|  fields: [a ASC, b DESC]
|  limit: 10
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 1

Concat

Nối kết quả của nhiều nút con và trả về kết quả cho nút mẹ. Nút này không loại bỏ các kết quả trùng lặp xuất hiện ở nhiều nút con và thứ tự của các kết quả được trả về là không xác định.

• Concat
├── • TableAccess
...
├── • TableAccess

Điện toán

Đánh giá một tập hợp các biểu thức, chỉ định kết quả cho một tập hợp các biến.

• Compute
|  $user_1: user
|  $full_name_1: str_concat($first_name_1, " ", $last_name_1)
|  $address_1: UNSET
|  records returned: 1

Bộ lọc

Chọn lọc và trả về các hàng nếu và chỉ nếu các hàng đó khớp với biểu thức được cung cấp.

• Filter
|  expression: $eq(foo, "bar")
|  records returned: 1

Giá trị

Tạo ra một chuỗi các giá trị cố định để xử lý. Được dùng chủ yếu khi một tập hợp danh sách tài liệu được cung cấp làm dữ liệu đầu vào cho một truy vấn.

• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]

Huỷ lồng

Huỷ lồng giá trị do nút con tạo ra.

• Unnest
|  expression: foo AS unnested_foo

Giới hạn

Giới hạn số lượng hàng được trả về cho nút mẹ.

• Limit
|  limit: 10
|  records returned: 1

Khoảng bù

Bỏ qua một số hàng do nút con tạo ra.

• Offset
|  offset: 10
|  records returned: 1