แชร์ผ่าน


การจัดทําดัชนีใน Cosmos DB ใน Microsoft Fabric

Cosmos DB เป็นฐานข้อมูลการวินิจฉัย schema ที่ช่วยให้คุณสามารถทําซ้ําในแอปพลิเคชันของคุณโดยไม่ต้องจัดการกับ schema หรือการจัดการดัชนี สิ่งนี้เรียกอีกอย่างว่า สคีมาในการอ่าน ซึ่งหมายความว่า Cosmos DB จะไม่บังคับใช้ Schema กับข้อมูลของคุณเมื่อเขียนลงในฐานข้อมูล แต่ Schema ของคุณจะถูกฉายภาพลงในคลาสที่คุณกําหนดภายในแอปพลิเคชันของคุณเมื่อคุณ deserialize ข้อมูลจากฐานข้อมูลเมื่อคุณอ่านหรือสืบค้นข้อมูลของคุณ

การทําดัชนีภายใน Cosmos DB ใน Microsoft Fabric ถูกออกแบบมาเพื่อส่งมอบประสิทธิภาพคิวรีที่รวดเร็วและยืดหยุ่น ไม่ว่าข้อมูลของคุณจะพัฒนาขึ้นอย่างไร ตามค่าเริ่มต้น Cosmos DB ทําดัชนีคุณสมบัติทุกรายการสําหรับทุกรายการในคอนเทนเนอร์ของคุณโดยอัตโนมัติโดยไม่ต้องกําหนด schema ใด ๆ หรือกําหนดค่าดัชนีรอง

แผนผังแนวคิด

ทุกครั้งที่จัดเก็บรายการในคอนเทนเนอร์ เนื้อหาจะถูกคาดการณ์เป็นเอกสาร JSON จากนั้นจะถูกแปลงเป็นตัวแทนทรี การแปลงนี้หมายความว่าทุกคุณสมบัติของสินค้านั้นจะถูกแสดงเป็นโหนดในแผนภูมิ โหนดราก pseudo ถูกสร้างขึ้นเป็นคุณสมบัติระดับแรกทั้งหมดของหน่วยข้อมูล โหนดใบไม้ประกอบด้วยค่าสเกลาจริงที่ดําเนินการโดยสินค้า

ตัวอย่างเช่น ให้พิจารณารายการนี้:

{
  "locations": [
    { 
      "country": "Germany", 
      "city": "Berlin" 
    },
    { 
      "country": "France", 
      "city": "Paris" 
    }
  ],
  "headquarters": { 
    "country": "Belgium", 
    "employees": 250 
  },
  "exports": [
    { 
      "city": "Moscow" 
    },
    { 
      "city": "Athens" 
    }
  ]
}

แผนภูมิแนวคิดนี้แสดงถึงรายการ JSON ตัวอย่าง:

  • locations
    • 0
      • country: Germany
      • city: Berlin
    • 1
      • country: France
      • city: Paris
  • headquarters
    • country: Belgium
    • employees: 250
  • exports
    • 0
      • city: Moscow
    • 1
      • city: Athens

แผนภาพที่แสดงแบบต้นไม้ของรายการใน Cosmos DB

แผนผังต้นไม้ที่แสดงโหนดรากที่มีสามสาขา: "ตําแหน่งที่ตั้ง", "สํานักงานใหญ่" และ "ส่งออก" "ตําแหน่งที่ตั้ง" แยกเป็นโหนดลําดับเลขสองรายการ โดยแต่ละโหนดย่อยที่เกี่ยวข้องกับตําแหน่งที่ตั้ง ("Germany หรือ Berlin" และ "France หรือ Paris") "สํานักงานใหญ่" มี "เบลเยียม" สําหรับตําแหน่งที่ตั้งและ "พนักงาน" ("250") "ส่งออก" แยกเป็นโหนดที่มีตัวเลขสองโหนด โดยแต่ละโหนดย่อย "city" ("มอสโก" และ "Athens")

ให้ความสนใจกับวิธีการเข้ารหัสอาร์เรย์ในทรี: ทุกรายการในอาร์เรย์จะได้รับโหนดขั้นกลางที่มีชื่อว่าดัชนีของรายการนั้นภายในอาร์เรย์ ตัวอย่างเช่น รายการแรกคือ 0 และรายการที่สองคือ1

เส้นทางคุณสมบัติ

Cosmos DB แปลงรายการเป็นต้นไม้เนื่องจากจะช่วยให้ระบบสามารถอ้างอิงคุณสมบัติโดยใช้เส้นทางภายในทรีเหล่านั้น เมื่อต้องการรับเส้นทางสําหรับคุณสมบัติ เราสามารถสํารวจต้นไม้จากโหนดรากไปยังคุณสมบัตินั้น และเชื่อมป้ายกํากับของแต่ละโหนดที่ตรวจสอบแล้วเข้าด้วยกัน

ต่อไปนี้เป็นเส้นทางสําหรับแต่ละคุณสมบัติจากรายการตัวอย่างที่อธิบายไว้ก่อนหน้านี้:

Path Value
/locations/0/country "Germany"
/locations/0/city "Berlin"
/locations/1/country "France"
/locations/1/city "Paris"
/headquarters/country "Belgium"
/headquarters/employees 250
/exports/0/city "Moscow"
/exports/1/city "Athens"

Cosmos DB ทําดัชนีเส้นทางของคุณสมบัติแต่ละเส้นทางและค่าที่สอดคล้องกันอย่างมีประสิทธิภาพเมื่อรายการถูกเขียน

ชนิดดัชนี

ในขณะนี้ Cosmos DB สนับสนุนดัชนีสี่ประเภท

คุณสามารถกําหนดค่าชนิดดัชนีเหล่านี้ได้เมื่อกําหนดนโยบายการทําดัชนี

ดัชนีช่วง

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

  • คําถามเกี่ยวกับความเท่าเทียมกัน:

    SELECT
      *
    FROM
      container c
    WHERE
      c.property = 'value'
    
    SELECT
      *
    FROM
      container c
    WHERE
      c.property IN ("value1", "value2", "value3")
    
  • การจับคู่ความเท่ากันบนองค์ประกอบอาร์เรย์

    SELECT
      *
    FROM
      container c
    WHERE
      ARRAY_CONTAINS(c.tags, "tag1")
    
  • แบบสอบถามช่วง:

    SELECT
      *
    FROM
      container c
    WHERE
      c.property > 0
    

    Note

    ทํางานสําหรับ >, <, >=, <=!=

  • กําลังตรวจสอบการปรากฏของคุณสมบัติ:

    SELECT
      *
    FROM
      container c
    WHERE
      IS_DEFINED(c.property)
    
  • ฟังก์ชันระบบสตริง:

    SELECT
      *
    FROM
      container c
    WHERE
      CONTAINS(c.property, "value")
    
    SELECT
      *
    FROM
      container c
    WHERE
      STRINGEQUALS(c.property, "value")
    
  • ORDER BY แบบ สอบ ถาม:

    SELECT
      *
    FROM
      container c
    ORDER BY
      c.property
    
  • JOIN แบบ สอบ ถาม:

    SELECT
      d
    FROM
      container c
    JOIN
      d IN c.properties
    WHERE
      d = 'value'
    

สามารถใช้ดัชนีช่วงกับค่าสเกลา (สตริงหรือตัวเลข) นโยบายการทําดัชนีเริ่มต้นสําหรับคอนเทนเนอร์ที่สร้างขึ้นใหม่จะบังคับใช้ดัชนีช่วงสําหรับสตริงหรือตัวเลขใด ๆ

Note

ORDER BYส่วนคําสั่งที่เรียงลําดับตามคุณสมบัติเดียวจําเป็นต้องมีดัชนีช่วงเสมอ และล้มเหลวหากเส้นทางที่อ้างอิงไม่มีดัชนี ในทํานองเดียวกัน แบบORDER BYสอบถามที่เรียงลําดับตามคุณสมบัติหลายรายการจําเป็นต้องมีดัชนีแบบรวมเสมอ

ดัชนีเชิงพื้นที่

ดัชนีเชิงพื้นที่ช่วยให้สามารถสืบค้นวัตถุเชิงพื้นที่ได้อย่างมีประสิทธิภาพ เช่น จุด เส้น รูปหลายเหลี่ยม และรูปหลายเหลี่ยม คิวรีเหล่านี้ใช้ ST_DISTANCEST_WITHINST_INTERSECTS คําสําคัญ ต่อไปนี้คือตัวอย่างบางส่วนที่ใช้ชนิดดัชนีเชิงพื้นที่:

  • คิวรีทางภูมิศาสตร์ทางไกล:

    SELECT
      *
    FROM
      container c
    WHERE
      ST_DISTANCE(c.property, { "type": "Point", "coordinates": [0.0, 10.0] }) < 40
    
  • Geospatial ภายในคิวรี:

    SELECT
      *
    FROM
      container c
    WHERE
      ST_WITHIN(c.property, {"type": "Point", "coordinates": [0.0, 10.0] })
    
  • คิวรีอินเทอร์เซกส์เชิงพื้นที่:

    SELECT
      *
    FROM
      container c
    WHERE
      ST_INTERSECTS(c.property, { 'type':'Polygon', 'coordinates': [[ [31.8, -5], [32, -5], [31.8, -5] ]]  })  
    

ดัชนีเชิงพื้นที่สามารถใช้กับออบเจ็กต์ GeoJSON ที่จัดรูปแบบได้อย่างถูกต้อง Points, LineStrings, Polygons และ MultiPolygons ได้รับการรองรับในขณะนี้

ดัชนีคอมโพสิต

ดัชนีแบบรวมจะเพิ่มประสิทธิภาพเมื่อคุณดําเนินการในหลายฟิลด์ ชนิดของดัชนีแบบรวมใช้สําหรับ:

  • ORDER BY คิวรีบนคุณสมบัติหลายรายการ:

    SELECT
      *
    FROM
      container c
    ORDER BY
      c.property1,
      c.property2
    
  • คิวรีที่มีตัวกรอง และORDER BY คิวรีเหล่านี้สามารถใช้ดัชนีแบบรวมได้ถ้าคุณสมบัติตัวกรองถูก ORDER BY เพิ่มลงในส่วนคําสั่ง

    SELECT
      *
    FROM
      container c
    WHERE
      c.property1 = 'value'
    ORDER BY
      c.property1,
      c.property2
    
  • คิวรีที่มีตัวกรองบนคุณสมบัติอย่างน้อยสองรายการที่มีคุณสมบัติอย่างน้อยหนึ่งอย่างเป็นตัวกรองความเท่ากัน:

    SELECT
      *
    FROM
      container c
    WHERE
      c.property1 = 'value' AND
      c.property2 > 'value'
    

ตราบใดที่เพรดิเคตตัวกรองหนึ่งรายการใช้ชนิดดัชนีชนิดใดชนิดหนึ่ง กลไกจัดการคิวรีจะประเมินว่าก่อนการสแกนส่วนที่เหลือ ตัวอย่างเช่น ถ้าคุณมีคิวรี SQL เช่น SELECT * FROM c WHERE c.department = "Information Technology" and CONTAINS(c.team, "Pilot"):

  • คิวรีนี้ใช้ตัวกรองสําหรับรายการที่ department = "Information Technology" โดยใช้ดัชนีก่อน จากนั้นจะส่งผ่านรายการทั้งหมด department = "Information Technology" ผ่านไปป์ไลน์ถัดไปเพื่อประเมิน CONTAINS เพรดิเคตตัวกรอง

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

ดัชนีเวกเตอร์

ดัชนีเวกเตอร์เพิ่มประสิทธิภาพเมื่อทําการค้นหาเวกเตอร์โดยใช้VECTORDISTANCEฟังก์ชันระบบ การค้นหาเวกเตอร์มีเวลาแฝงต่ํากว่า ปริมาณงานที่สูงขึ้น และปริมาณการใช้ RU น้อยลงเมื่อใช้ดัชนีเวกเตอร์ Cosmos DB สนับสนุนการฝังเวกเตอร์ใด ๆ (ข้อความรูปภาพหลายมิติ ฯลฯ ) ภายใต้ขนาด 4,096 ขนาด

  • ORDER BY คิวรีค้นหาเวกเตอร์:

    SELECT TOP 10
      *
    FROM
      container c
    ORDER BY
      VECTORDISTANCE(c.vector1, c.vector2)
    
  • การคาดการณ์ของคะแนนความคล้ายคลึงกันในคิวรีการค้นหาเวกเตอร์:

    SELECT TOP 10
      c.name,
      VECTORDISTANCE(c.vector1, c.vector2) AS score
    FROM
      container c
    ORDER BY
      VECTORDISTANCE(c.vector1, c.vector2)
    
  • ตัวกรองช่วงบนคะแนนความคล้ายคลึงกัน

    SELECT TOP 10
      *
    FROM
      container c
    WHERE
      VECTORDISTANCE(c.vector1, c.vector2) > 0.8
    ORDER BY
      VECTORDISTANCE(c.vector1, c.vector2)
    

Important

นโยบายเวกเตอร์และดัชนีเวกเตอร์ไม่สามารถใช้งานได้หลังจากการสร้าง เมื่อต้องการเปลี่ยนแปลง ให้สร้างคอลเลกชันใหม่

การใช้ดัชนี

มีห้าวิธีที่กลไกจัดการคิวรีสามารถประเมินตัวกรองคิวรี โดยเรียงลําดับตามมีประสิทธิภาพมากที่สุดเพื่อประสิทธิภาพน้อยที่สุด:

  • ดัชนีแสวงหา
  • สแกนดัชนีที่แม่นยํา
  • การสแกนดัชนีแบบขยาย
  • การสแกนดัชนีแบบเต็ม
  • สแกนแบบเต็ม

เมื่อคุณทําดัชนีเส้นทางของคุณสมบัติ กลไกจัดการคิวรีจะใช้ดัชนีโดยอัตโนมัติอย่างมีประสิทธิภาพที่สุดเท่าที่เป็นไปได้ นอกเหนือจากการจัดทําดัชนีเส้นทางคุณสมบัติใหม่ คุณไม่จําเป็นต้องกําหนดค่าใด ๆ เพื่อปรับวิธีการใช้คิวรีให้เหมาะสม ค่าธรรมเนียม RU ของคิวรีคือการรวมกันของทั้งค่าธรรมเนียม RU จากการใช้งานดัชนีและค่าธรรมเนียม RU จากการโหลดรายการ

ตารางต่อไปนี้สรุปวิธีการต่าง ๆ ในการใช้ดัชนีใน Cosmos DB:

ชนิดการค้นหา Description ตัวอย่างทั่วไป ค่าธรรมเนียมจากการใช้งานดัชนี ค่าธรรมเนียมจากการโหลดสินค้าจากที่เก็บข้อมูลทางธุรกรรม
ดัชนีแสวงหา อ่านค่าที่มีการจัดทําดัชนีที่จําเป็นเท่านั้น และโหลดเฉพาะรายการที่ตรงกันจากที่เก็บข้อมูลทางธุรกรรม ตัวกรองความเท่ากัน IN ตัวกรองความเท่ากันคงที่ เพิ่มตามจํานวนรายการในผลลัพธ์คิวรี
สแกนดัชนีที่แม่นยํา ค้นหาค่าที่เป็นดัชนีไบนารีและโหลดเฉพาะรายการที่ตรงกันจากที่เก็บข้อมูลทรานแซคชัน การเปรียบเทียบช่วง (>, , <<= หรือ >=), StartsWith เปรียบเทียบกับการค้นหาดัชนี เพิ่มเล็กน้อยตามคาร์ดินาลลิตี้ของคุณสมบัติที่จัดทําดัชนี เพิ่มตามจํานวนรายการในผลลัพธ์คิวรี
การสแกนดัชนีแบบขยาย การค้นหาที่ปรับให้เหมาะสม (แต่มีประสิทธิภาพน้อยกว่าการค้นหาไบนารี) ของค่าที่มีการจัดทําดัชนี และโหลดเฉพาะรายการที่ตรงกันจากที่เก็บข้อมูลทรานแซคชัน StartsWith (ไม่ตรงตามตัวพิมพ์ใหญ่-เล็ก), StringEquals (ไม่ตรงตามตัวพิมพ์ใหญ่-เล็ก) เพิ่มขึ้นเล็กน้อยขึ้นอยู่กับคาร์ดินาลลิตี้ของคุณสมบัติที่จัดทําดัชนี เพิ่มตามจํานวนรายการในผลลัพธ์คิวรี
การสแกนดัชนีแบบเต็ม อ่านชุดค่าดัชนีที่แตกต่างกันและโหลดเฉพาะรายการที่ตรงกันจากที่เก็บข้อมูลเชิงธุรกรรม ประกอบด้วย, EndsWith, RegexMatch, LIKE เพิ่มเชิงเส้นตามคาร์ดินาลลิตี้ของคุณสมบัติที่จัดทําดัชนี เพิ่มตามจํานวนรายการในผลลัพธ์คิวรี
สแกนแบบเต็ม โหลดสินค้าทั้งหมดจากที่เก็บข้อมูลธุรกรรม บน, ล่าง N/A เพิ่มตามจํานวนสินค้าในคอนเทนเนอร์

เมื่อเขียนคิวรี คุณควรใช้เพรดิเคตตัวกรองที่ใช้ดัชนีอย่างมีประสิทธิภาพที่สุดเท่าที่เป็นไปได้ ตัวอย่างเช่นถ้า StartsWith หรือ Contains จะทํางานสําหรับกรณีการใช้งานของคุณ คุณควรเลือก StartsWith ใช้เนื่องจากเป็นการสแกนดัชนีที่แม่นยําแทนที่จะเป็นการสแกนดัชนีเต็มรูปแบบ

รายละเอียดการใช้ดัชนี

Tip

ส่วนนี้ครอบคลุมรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการใช้ดัชนีคิวรี ระดับรายละเอียดนี้ไม่จําเป็นต้องเรียนรู้วิธีการเริ่มต้นใช้งาน Cosmos DB แต่ได้รับการจัดทําเป็นเอกสารในรายละเอียดสําหรับผู้ใช้ที่อยากรู้อยากเห็น เราอ้างอิงรายการตัวอย่างที่ใช้ร่วมกันก่อนหน้านี้ในเอกสารนี้:

พิจารณาสองรายการตัวอย่างเหล่านี้:

[
  {
    "id": 1,
    "locations": [
      { "country": "Germany", "city": "Berlin" },
      { "country": "France", "city": "Paris" }
    ],
    "headquarters": { "country": "Belgium", "employees": 250 },
    "exports": [
      { "city": "Moscow" },
      { "city": "Athens" }
    ]
  },
  {
    "id": 2,
    "locations": [
      { "country": "Ireland", "city": "Dublin" }
    ],
    "headquarters": { "country": "Belgium", "employees": 200 },
    "exports": [
      { "city": "Moscow" },
      { "city": "Athens" },
      { "city": "London" }
    ]
  }
]

Cosmos DB ใช้ดัชนีผกผุด ดัชนีทํางานโดยการแมปเส้นทาง JSON แต่ละเส้นทางไปยังชุดของรายการที่ประกอบด้วยค่านั้น การแมปรหัสรายการจะแสดงในหน้าดัชนีที่แตกต่างกันมากมายสําหรับคอนเทนเนอร์ นี่คือไดอะแกรมตัวอย่างของดัชนีผกผลักสําหรับคอนเทนเนอร์ที่มีสองรายการตัวอย่าง:

Path Value รายการตัวระบุหน่วยข้อมูล
/locations/0/country Germany [1]
/locations/0/country Ireland [2]
/locations/0/city Berlin [1]
/locations/0/city Dublin [2]
/locations/1/country France [1]
/locations/1/city Paris [1]
/headquarters/country Belgium [1, 2]
/headquarters/employees 200 [2]
/headquarters/employees 250 [1]

ดัชนีแบบผกผกผสองมีแอตทริบิวต์ที่สําคัญสองอย่าง:

  • สําหรับเส้นทางที่กําหนด ค่าจะเรียงลําดับจากน้อยไปหามาก ดังนั้น กลไกจัดการคิวรีสามารถให้บริการ ORDER BY ได้อย่างง่ายดายจากดัชนี

  • สําหรับเส้นทางที่กําหนด กลไกจัดการคิวรีสามารถสแกนผ่านชุดค่าที่เป็นไปได้ที่แตกต่างกันเพื่อระบุหน้าดัชนีที่มีผลลัพธ์

กลไกจัดการคิวรีสามารถใช้ประโยชน์จากดัชนีผกผังในสี่วิธีที่แตกต่างกัน:

ดัชนีแสวงหา

พิจารณาคิวรีต่อไปนี้:

SELECT
  location
FROM
  location IN company.locations
WHERE
  location.country = 'France'

เพรดิเคตคิวรี (การกรองบนรายการที่มีตําแหน่งที่ตั้งใด ๆ มี "ฝรั่งเศส" เป็นภูมิภาคของมัน) จะตรงกับเส้นทางที่ถูกเรียกมาที่นี่:

  • locations
    • 1
      • country: France

แผนภาพของธุรกรรม (ค้นหา) ที่ตรงกับเส้นทางที่ระบุภายในการแสดงข้อมูลแบบทรีของหน่วยข้อมูลใน Cosmos DB

แผนผังต้นไม้ที่แสดงโหนดรากที่มีสามสาขา: "ตําแหน่งที่ตั้ง", "สํานักงานใหญ่" และ "ส่งออก" "ตําแหน่งที่ตั้ง" แยกเป็นโหนดลําดับเลขสองรายการ โดยแต่ละโหนดย่อยที่เกี่ยวข้องกับตําแหน่งที่ตั้ง ("Germany/Berlin" และ "France/Paris") "สํานักงานใหญ่" มี "เบลเยียม" สําหรับตําแหน่งที่ตั้งและ "พนักงาน" ("250") "ส่งออก" แยกเป็นโหนดที่มีตัวเลขสองโหนด โดยแต่ละโหนดย่อย "city" ("มอสโก" และ "Athens") เส้นทางสําหรับ "ตําแหน่งที่ตั้ง" "1" ตําแหน่ง และ "ฝรั่งเศส" จะถูกเน้น

เนื่องจากคิวรีนี้มีตัวกรองความเท่ากัน หลังจากย้อนกลับทรีนี้ เราสามารถระบุหน้าดัชนีที่มีผลลัพธ์คิวรีได้อย่างรวดเร็ว ในกรณีนี้ กลไกจัดการคิวรีจะอ่านหน้าดัชนีที่ประกอบด้วยหน่วยข้อมูล 1 การค้นหาดัชนีเป็นวิธีที่มีประสิทธิภาพที่สุดในการใช้ดัชนี ด้วยการค้นหาดัชนี เราจะอ่านเฉพาะหน้าดัชนีที่จําเป็นและโหลดเฉพาะรายการในผลลัพธ์คิวรีเท่านั้น ดังนั้นเวลาในการค้นหาดัชนีและค่าธรรมเนียม RU จากการค้นหาดัชนีจึงต่ําอย่างไม่น่าเชื่อ โดยไม่คํานึงถึงปริมาณข้อมูลทั้งหมด

สแกนดัชนีที่แม่นยํา

พิจารณาคิวรีต่อไปนี้:

SELECT
  *
FROM
  company
WHERE
  company.headquarters.employees > 200

เพรดิเคตคิวรี (การกรองบนรายการที่มีพนักงานมากกว่า 200 คน) สามารถประเมินได้ด้วยการสแกนดัชนีที่แม่นยําของ headquarters/employees เส้นทาง เมื่อทําการสแกนดัชนีที่แม่นยํา กลไกจัดการคิวรีเริ่มต้นโดยทําการค้นหาแบบไบนารีของชุดค่าที่แตกต่างกันเพื่อหาตําแหน่งที่ตั้งของค่า 200 สําหรับ headquarters/employees เส้นทาง เนื่องจากค่าสําหรับแต่ละเส้นทางจะเรียงลําดับจากน้อยไปหามาก จึงเป็นเรื่องง่ายสําหรับเครื่องมือคิวรีที่จะทําการค้นหาไบนารี หลังจากที่กลไกจัดการคิวรีพบค่า 200แล้ว จะเริ่มอ่านหน้าดัชนีที่เหลือทั้งหมด (ไปในทิศทางจากน้อยไปหามาก)

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

การสแกนดัชนีแบบขยาย

พิจารณาคิวรีต่อไปนี้:

SELECT
  *
FROM
  company
WHERE
  STARTSWITH(company.headquarters.country, "United", true)

เพรดิเคตคิวรี (การกรองรายการที่มีสํานักงานใหญ่ในตําแหน่งที่ตั้งที่เริ่มต้นด้วย "United") ที่ไม่ตรงตามตัวพิมพ์ใหญ่-เล็ก) สามารถประเมินได้ด้วยการสแกนดัชนีแบบขยายของ headquarters/country เส้นทาง การดําเนินการที่ทําการสแกนดัชนีแบบขยายมีการปรับให้เหมาะสมซึ่งสามารถช่วยหลีกเลี่ยงความต้องการในการสแกนทุกหน้าดัชนี แต่มีราคาแพงกว่าการค้นหาไบนารีของดัชนีที่แม่นยําเล็กน้อย

ตัวอย่างเช่น เมื่อประเมินค่าที่ไม่ตรงตาม StartsWithตัวพิมพ์ใหญ่-เล็ก กลไกจัดการคิวรีจะตรวจสอบดัชนีสําหรับการรวมที่เป็นไปได้ที่แตกต่างกันของค่าตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก การปรับให้เหมาะสมนี้ช่วยให้กลไกจัดการคิวรีสามารถหลีกเลี่ยงการอ่านหน้าดัชนีส่วนใหญ่ได้ ฟังก์ชันระบบที่แตกต่างกันมีการปรับให้เหมาะสมที่แตกต่างกันที่พวกเขาสามารถใช้เพื่อหลีกเลี่ยงการอ่านทุกหน้าดัชนีเพื่อให้มีการจัดประเภทอย่างกว้างขวางเป็นการสแกนดัชนีที่ขยาย

การสแกนดัชนีแบบเต็ม

พิจารณาคิวรีต่อไปนี้:

SELECT
  *
FROM
  company
WHERE
  CONTAINS(company.headquarters.country, "United")

เพรดิเคตคิวรี (การกรองบนรายการที่มีสํานักงานใหญ่ในตําแหน่งที่ตั้งที่มี "สหรัฐ") สามารถประเมินได้ด้วยการสแกนดัชนีของ headquarters/country เส้นทาง การสแกนดัชนีแบบเต็มจะสแกนผ่านชุดค่าที่เป็นไปได้ที่แตกต่างกันเพื่อระบุหน้าดัชนีที่มีผลลัพธ์ซึ่งไม่เหมือนกับการสแกนดัชนีที่แม่นยํา ในกรณีนี้ CONTAINS จะถูกเรียกใช้บนดัชนี เวลาในการค้นหาดัชนีและค่าธรรมเนียม RU สําหรับการสแกนดัชนีเพิ่มขึ้นเมื่อคาร์ดินาลลิตี้ของเส้นทางเพิ่มขึ้น กล่าวอีกนัยหนึ่ง คือ ยิ่งค่าที่แตกต่างกันมากขึ้นเท่าใด กลไกจัดการคิวรีจําเป็นต้องสแกน ก็จะยิ่งความล่าช้าและค่าธรรมเนียม RU เกี่ยวข้องในการสแกนดัชนีเต็มรูปแบบสูงขึ้นเท่านั้น

ตัวอย่างเช่น พิจารณาคุณสมบัติสองประการ: town และcountry คาร์ดินาลลิตี้ของเมืองคือ 5,000 และคาร์ดินาลลิตี้ของ country คือ 200 ต่อไปนี้คือคิวรีตัวอย่างสองรายการที่แต่ละรายการมี CONTAINS ฟังก์ชันระบบที่ทําการสแกนดัชนีเต็มรูปแบบกับ town คุณสมบัติ คิวรีแรกใช้หน่วยคําขอเพิ่มเติม (RUs) มากกว่าคิวรีที่สองเนื่องจากคาร์ดินาลลิตี้ของเมืองสูงกว่าcountry

SELECT
  *
FROM
  container c
WHERE
 CONTAINS(c.town, "Red", false)
SELECT
  *
FROM
  c
WHERE
  CONTAINS(c.country, "States", false)

สแกนแบบเต็ม

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

คิวรีเวกเตอร์ค้นหาโดยไม่มีดัชนีเวกเตอร์ที่กําหนด

ถ้าคุณไม่ได้กําหนดนโยบายดัชนีเวกเตอร์และใช้ VECTORDISTANCE ฟังก์ชันระบบใน ORDER BY คําสั่งย่อย คิวรีนี้จะส่งผลให้มีการสแกนเต็มรูปแบบและมีค่าธรรมเนียม RU สูงกว่านโยบายดัชนีเวกเตอร์หากคุณกําหนดนโยบายดัชนีเวกเตอร์ ความคล้ายคลึงกัน หากคุณใช้กับ VECTORDISTANCE ค่าบูลีนเดรัจฉานที่ตั้งค่าเป็น จริง และไม่มี flat ดัชนีที่กําหนดไว้สําหรับเส้นทางเวกเตอร์ การสแกนแบบเต็มจะเกิดขึ้น

คิวรีที่มีนิพจน์ตัวกรองที่ซับซ้อน

ในตัวอย่างก่อนหน้านี้ เราพิจารณาเฉพาะคิวรีที่มีนิพจน์ตัวกรองอย่างง่าย (ตัวอย่างเช่น คิวรีที่มีเพียงตัวกรองความเท่ากันหรือช่วงเดียว) ในความเป็นจริง คิวรีส่วนใหญ่มีนิพจน์ตัวกรองที่ซับซ้อนมากขึ้น

พิจารณาคิวรีต่อไปนี้:

SELECT
  *
FROM
  company
WHERE
  company.headquarters.employees = 200 AND CONTAINS(company.headquarters.country, "United")

เมื่อต้องดําเนินการคิวรีนี้ กลไกจัดการคิวรีจะต้องค้นหาดัชนีheadquarters/employeesและการสแกนดัชนีเต็มรูปแบบบนheadquarters/country กลไกจัดการคิวรีมีฮิวริสติกภายในที่ใช้ในการประเมินนิพจน์ตัวกรองคิวรีอย่างมีประสิทธิภาพที่สุดเท่าที่เป็นไปได้ ในกรณีนี้ กลไกจัดการคิวรีจะหลีกเลี่ยงความจําเป็นในการอ่านหน้าดัชนีที่ไม่จําเป็น โดยการดําเนินการค้นหาดัชนีก่อน ตัวอย่างเช่น ถ้ามีเพียง 50 รายการเท่านั้นที่ตรงกับตัวกรองความเท่ากัน กลไกจัดการคิวรีจะต้องประเมิน CONTAINS บนหน้าดัชนีที่มี 50 รายการเหล่านั้น การสแกนดัชนีแบบเต็มของคอนเทนเนอร์ทั้งหมดจะไม่จําเป็น

การใช้ดัชนีสําหรับฟังก์ชันการรวมสเกลา

คิวรีที่มีฟังก์ชันการรวมต้องขึ้นอยู่กับดัชนีเท่านั้นจึงจะสามารถใช้งานได้

ในบางกรณี ดัชนีสามารถส่งกลับค่าบวกเท็จ ตัวอย่างเช่น เมื่อประเมิน CONTAINS ผลดัชนี จํานวนรายการที่ตรงกันในดัชนีอาจเกินจํานวนผลลัพธ์คิวรี กลไกจัดการคิวรีจะโหลดรายการที่ตรงกันของดัชนีทั้งหมด ประเมินตัวกรองบนรายการที่โหลด และแสดงเฉพาะผลลัพธ์ที่ถูกต้องเท่านั้น

สําหรับคิวรีส่วนใหญ่ การโหลดรายการที่ตรงกันกับดัชนีค่าบวกเท็จจะไม่มีผลกระทบใด ๆ ที่เห็นได้ชัดเจนต่อการใช้ดัชนี

ตัวอย่างเช่น ให้พิจารณาคิวรีต่อไปนี้:

SELECT
  *
FROM
  company
WHERE
  CONTAINS(company.headquarters.country, "United")

ฟังก์ชัน CONTAINS ระบบอาจส่งกลับค่าที่ตรงกันเชิงบวกเท็จ ดังนั้นกลไกจัดการคิวรีจําเป็นต้องตรวจสอบว่ารายการที่โหลดแต่ละรายการตรงกับนิพจน์ตัวกรองหรือไม่ ในตัวอย่างนี้ กลไกจัดการคิวรีอาจจําเป็นต้องโหลดรายการเพิ่มเติมเพียงไม่กี่รายการ เท่านั้น ดังนั้นผลกระทบต่อการใช้ดัชนีและค่าธรรมเนียม RU จึงมีไม่มาก

อย่างไรก็ตาม คิวรีที่มีฟังก์ชันการรวมจะต้องพึ่งพาดัชนีเป็นพิเศษเพื่อใช้งาน ตัวอย่างเช่น พิจารณาคิวรีต่อไปนี้ที่มี COUNT การรวม:

SELECT
  COUNT(1)
FROM
  company
WHERE
  CONTAINS(company.headquarters.country, "United")

เช่นเดียวกับในตัวอย่าง CONTAINS แรก ฟังก์ชันระบบอาจส่งคืนการจับคู่ค่าบวกเท็จบางอย่าง SELECT *อย่างไรก็ตาม แตกต่างจากคิวรี อย่างไรก็ตาม COUNT คิวรีไม่สามารถประเมินนิพจน์ตัวกรองบนรายการที่โหลดเพื่อตรวจสอบรายการดัชนีทั้งหมดที่ตรงกัน คิวรี COUNT ต้องพึ่งพาดัชนีโดยเฉพาะ ดังนั้นถ้ามีโอกาสที่นิพจน์ตัวกรองจะส่งกลับค่าที่ตรงกันเชิงบวกเท็จ กลไกจัดการคิวรีจะเริ่มต้นการสแกนเต็มรูปแบบ

คิวรีที่มีฟังก์ชันการรวมต่อไปนี้ต้องขึ้นอยู่กับดัชนีเท่านั้น ดังนั้นการประเมินฟังก์ชันระบบบางอย่างต้องมีการสแกนเต็มรูปแบบ