วิธีเพิ่มประสิทธิภาพการสืบค้น SOQL เมื่อฉันมีบันทึกบัญชี 15 ล้านรายการ

Aug 15 2020

ฉันมีกรณีการใช้งานที่ฉันกำลังเปิดโปงบริการ Rest แบบกำหนดเองซึ่งจะยอมรับโทรศัพท์ # เป็นอาร์กิวเมนต์และเปรียบเทียบกับฟิลด์โทรศัพท์ # ห้าช่องในบัญชีและจะส่งคืนระเบียนเดียวที่ตรงกับหมายเลขโทรศัพท์ทั้งห้าหมายเลข ในกรณีหากพบหลายระเบียนควรส่งคืนระเบียนที่สร้างเร็วที่สุด ข้อกังวล / ปัญหาเดียวของฉันคือเมื่อสิ่งนี้นำไปสู่การใช้งานจริงมันจะไม่ทำงาน / จะมีปัญหาด้านประสิทธิภาพเนื่องจากมีบันทึกบัญชี 15 ล้านรายการ ฉันสามารถทำดัชนีฟิลด์ได้ แต่จะช่วยได้จริงหรือเมื่อจำนวนบันทึกสูงมาก? ฉันจะขอบคุณข้อเสนอแนะ / ความช่วยเหลือในการเพิ่มประสิทธิภาพ SOQL นี้

SOQL:

[SELECT Id 
FROM Account 
WHERE RecordType=’Person Account’ 
AND (Parent_Phone_Number__c= :phoneNo OR Student_Phone_Number__c= :phoneNo OR 
Alternate_Number_1__c= :phoneNo OR Alternate_Number_2__c= :phoneNo OR 
Alternate_Number_3__c= :phoneNo)
ORDER BY CreatedDate DESC 
LIMIT 1];

PS: ฉันถามทีม Biz แล้วว่าเราสามารถมีช่อง # โทรศัพท์เพียงช่องเดียวในขณะเปรียบเทียบ แต่พวกเขายืนกรานกับห้าช่อง

คำตอบ

3 sfdcfox Aug 15 2020 at 19:51

นี่เป็นกรณีการใช้งานที่สมบูรณ์แบบสำหรับ SOSL แทน คุณทำได้:

FIND :phoneNumber 
IN PHONE FIELDS
RETURNING Account(
  Id 
  WHERE RecordType.Name='Person Account'
  ORDER BY CreatedDate
  LIMIT 1
)

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

คำสั่งนี้จะยังคงเป็นจริงกับ SOQL โดยวิธีการ; คุณต้องเลือกคิวรีซึ่งหมายความว่าไม่ใช้ฟิลด์สูตร ตราบใดที่ช่องทั้งหมดที่กรองแล้วได้รับการจัดทำดัชนีแบบสอบถามเดิมของคุณก็ไม่น่าจะมีปัญหาแม้จะมีปริมาณข้อมูลถึง 15 ล้านรายการก็ตาม