การอ้างอิงการดำเนินการค้นหา

หน้านี้อธิบายเอาต์พุตของการค้นหาที่ดำเนินการด้วย Query Explain ดูวิธีเรียกใช้การค้นหาด้วย Query Explain ได้ที่ วิเคราะห์การดำเนินการค้นหาด้วย Query Explain

แนวคิดทั่วไป

แนวคิดและคำศัพท์ที่ใช้กันโดยทั่วไปต่อไปนี้จะใช้ในแผนผังการดำเนินการ

แถวและระเบียน

คำว่าแถวและระเบียนใช้เพื่ออ้างอิงถึงรายการเอกสารหรือดัชนีโดยทั่วไป

ตัวแปร

$ หมายถึงตัวแปรที่สร้างขึ้นหรือ อ้างอิงในแผนผังการดำเนินการ ตัวอย่างเช่น $foo_1 โดยปกติแล้ว ตัวแปรเหล่านี้จะใช้เพื่อ อ้างอิงเนื้อหาของเอกสารหรือค่าของนิพจน์ที่ประเมิน ระหว่างการเรียกใช้คําค้นหา

ตัวแปรภายในต่อไปนี้อาจปรากฏในโหนดการดำเนินการ

  • $__key__-คีย์คือตัวระบุภายในสำหรับเอกสาร นี่คือตัวระบุที่ไม่ซ้ำกันแบบสัมบูรณ์ที่มีโปรเจ็กต์ ฐานข้อมูล และเส้นทางแบบเต็มของเอกสาร
  • $__id__- รหัสเป็นตัวระบุที่ไม่ซ้ำกันสำหรับเอกสารภายในคอลเล็กชัน ซึ่งไม่ซ้ำกันภายในคอลเล็กชันเดียว

ลองพิจารณาตัวอย่างที่ใช้โหนด Compute เพื่อคำนวณ__id__จากเอกสาร __key__

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

ข้อจำกัดและช่วง

โหนดการสแกนบางรายการใช้แอตทริบิวต์ constraints และ ranges เพื่ออธิบายช่วง ของค่าที่สแกน แอตทริบิวต์เหล่านี้ใช้รูปแบบแผนภูมิช่วงซึ่ง มีรายการค่า ค่าเหล่านี้สอดคล้องกับรายการคีย์ที่เรียงลำดับ ซึ่งปรากฏในคำจำกัดความดัชนี เช่น ช่วงแรกที่ปรากฏ ในแผนผัง (1..5] ตรงกับข้อจํากัดของคีย์แรก a ในรายการคีย์ที่เรียงลําดับ

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

การเยื้องแต่ละระดับจะระบุข้อจำกัดที่ใช้กับคีย์ถัดไปในรายการ วงเล็บเหลี่ยมแสดงถึงช่วงที่รวมค่าเริ่มต้นและค่าสิ้นสุด ส่วนวงเล็บกลมแสดงถึงช่วงที่ ไม่รวมค่าเริ่มต้นและค่าสิ้นสุด ในกรณีนี้ ข้อจำกัดจะแปลเป็น 1 < "a" <= 5 และ "b" = 1

ในตัวอย่างต่อไปนี้ที่มีหลายสาขาสำหรับ a, ข้อจำกัดจะสอดคล้องกับ 1 < a <= 5 OR a = 10 ดังนี้

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

ตัวแปรหลัก

ในโหนดการสแกนบางรายการ (เช่น SequentialScan) จะมีทั้งรายการคีย์เป็นส่วนหนึ่งของแอตทริบิวต์ index และแอตทริบิวต์ keys แยกต่างหากในโหนด Scan แอตทริบิวต์ keys ในโหนด Scan จะแสดงชื่อตัวแปรของคีย์แต่ละรายการใน คำจำกัดความดัชนีตามลำดับ ตัวแปรสามารถใช้เพื่ออ้างอิงค่ารันไทม์ ของฟิลด์ที่สแกนได้ในระดับที่สูงขึ้นในแผนผังการดำเนินการ

ในตัวอย่างต่อไปนี้ ค่าของฟิลด์ user สำหรับเอกสารปัจจุบัน จะแมปกับตัวแปร $user_1 และค่าของ date_placed จะแมปกับ $date_placed_1

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

โหนดการดำเนินการ

ทรีการดำเนินการของคําค้นหาอาจมีโหนดต่อไปนี้

SeekingScan

แสดงการสแกนแบบไดนามิกซึ่งแถวที่ส่งคืนอาจไม่ได้อยู่ในช่วงลำดับเดียวของดัชนี และต้องทำการสแกนที่แตกต่างกันหลายครั้งเพื่อตอบสนองคำค้นหา

ตัวอย่างเช่น การค้นหาที่ a มีอยู่และ b เท่ากับ 1 ซึ่งทำงานในดัชนีของ ["a" ASC, "b" ASC] จะต้องสแกนและแสดงผลช่วงที่แยกต่างหากซึ่งอาจไม่ใช่ช่วงตามลำดับสำหรับค่าที่แตกต่างกันแต่ละค่าของ a ซึ่งมีประสิทธิภาพมากกว่า TableScan แบบเต็ม แต่มีประสิทธิภาพน้อยกว่า SequentialScan รายการเดียวในดัชนีผสมของ ["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

แสดงการสแกนช่วงแถวแบบคงที่และต่อเนื่องในที่เก็บข้อมูลที่สามารถ ดำเนินการได้ในการอ่านครั้งเดียว

key ordering length หมายถึงจำนวนคีย์ที่ต้องเก็บรักษา และส่งคืนตามลำดับคีย์เดิม สำหรับสคีมาของ [k1, k2, k3] ความยาวการจัดลำดับคีย์เป็น 0 หมายความว่าการสแกนจะแสดงผลตามลำดับใดก็ได้ 1 หมายความว่าจัดเรียงตาม k1 แต่แถวที่มีค่า k1 เดียวกันอาจมีลำดับใดก็ได้ 3 จะแสดงผลเอกสารตามลำดับที่จัดเรียงไว้

• 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

แสดงการสแกนช่วงแถวแบบคงที่และต่อเนื่องในที่เก็บข้อมูลที่มี การซ้ำกันของแถวในหน่วยความจำ

• 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

เชื่อมโยงรหัสของแถวที่ระบุกับเนื้อหาแถวจริงจากที่เก็บข้อมูลหลัก TableAccess จำเป็นต้องระบุหากโหนดหลัก (หรือผลการค้นหาสุดท้าย) ต้องใช้ฟิลด์ย่อยจากเอกสาร

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

LookupById

ดำเนินการรวมโดยการค้นหาเอกสารในคอลเล็กชันภายนอกตามรหัส ระบบจะดึงรหัสที่จะค้นหาจากฟิลด์ในเอกสารอินพุต ระบบจะเพิ่มผลลัพธ์ของการค้นหาเป็นฟิลด์ใหม่ในเอกสารอินพุต

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

TableScan

การสแกนคอลเล็กชันแบบเต็มโดยไม่มีการเรียงลำดับ ใช้เมื่อเรียกใช้การค้นหาโดยไม่มีดัชนีที่เชื่อมโยง

ลำดับอาจเป็น STABLE หรือ UNDEFINED โดย STABLE หมายถึงการจัดลำดับที่แน่นอน

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

HashAggregate

การนำการดำเนินการรวมไปใช้โดยใช้แฮช ต้องสร้างกลุ่มทั้งหมดในหน่วยความจำก่อนแสดงผลลัพธ์ และต้องไม่เกินขีดจำกัดหน่วยความจำของคิวรี

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

StreamAggregate

โหนดการรวบรวมเฉพาะทางซึ่งจะรักษาสถานะสำหรับกลุ่มเดียวในแต่ละครั้งเท่านั้น ซึ่งจะช่วยลดการใช้งานหน่วยความจำสูงสุด ใช้เมื่อโหนดย่อยพื้นฐานจะ แสดงกลุ่มตามลำดับ เช่น เมื่อจัดกลุ่มตามค่าที่ไม่ซ้ำกันของ ฟิลด์ขณะใช้ดัชนีในฟิลด์นั้น

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

MajorSort

ดำเนินการจัดเรียงในชุดพร็อพเพอร์ตี้ที่กำหนด สร้างบันทึกทั้งหมด ในหน่วยความจำพร้อมกันและแสดงผลค่าที่จัดเรียงตามลำดับ โดยขนาดของชุดการจัดเรียง จะจำกัดตามขีดจำกัดหน่วยความจำของคิวรี

เมื่อมีการระบุขีดจํากัดที่ตามมา ระบบจะใช้อัลกอริทึมการจัดเรียงข้อมูลสูงสุด k เพื่อลด การใช้หน่วยความจำ โดยจะใช้เพื่อจัดเรียงชุดระเบียนขนาดใหญ่ได้ตราบใดที่หน่วยความจำที่ใช้ในการจัดเก็บองค์ประกอบ k ที่พิจารณาไม่เกินขีดจำกัด

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

Concat

เชื่อมผลลัพธ์ของโหนดย่อยหลายรายการและส่งคืนผลลัพธ์ไปยัง โหนดหลัก โหนดนี้จะไม่ขจัดผลการค้นหาที่ซ้ำกันซึ่งปรากฏใน หลายๆ รายการ และลำดับของผลการค้นหาที่แสดงจะไม่แน่นอน

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

Compute

ประเมินชุดนิพจน์โดยกำหนดผลลัพธ์ให้กับชุดตัวแปร

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

ตัวกรอง

แสดงผลแถวอย่างเลือกสรรเฉพาะในกรณีที่ตรงกับนิพจน์ที่ระบุ

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

ค่า

สร้างลำดับค่าลิเทอรัลเพื่อใช้ในการดำเนินการ ใช้เป็นหลักเมื่อระบุชุด รายการเอกสารเป็นอินพุตของคำค้นหา

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

ยกเลิกการซ้อน

ยกเลิกการซ้อนค่าที่สร้างโดยโหนดลูก

• Unnest
|  expression: foo AS unnested_foo

ขีดจำกัด

จำกัดจำนวนแถวที่แสดงผลไปยังโหนดหลัก

• Limit
|  limit: 10
|  records returned: 1

ออฟเซ็ต

ข้ามจำนวนแถวที่กำหนดซึ่งสร้างโดยโหนดย่อย

• Offset
|  offset: 10
|  records returned: 1