Làm thế nào để Tối ưu hóa Truy vấn SOQL khi tôi có 15 triệu bản ghi Tài khoản?
Tôi có một trường hợp sử dụng trong đó tôi đang trình bày một dịch vụ Rest tùy chỉnh sẽ chấp nhận số điện thoại làm đối số và so sánh với năm trường điện thoại # trên Tài khoản và sẽ trả về một bản ghi duy nhất khớp với một trong năm số điện thoại. Trong trường hợp nếu tìm thấy nhiều bản ghi thì nên trả lại bản ghi được tạo sớm nhất. Mối quan tâm / vấn đề duy nhất của tôi là khi điều này đi vào sản xuất, nó sẽ không hoạt động / sẽ có vấn đề về hiệu suất vì có 15 triệu bản ghi Tài khoản. Tôi có thể lập chỉ mục các trường, nhưng liệu điều đó có thực sự hữu ích khi số lượng bản ghi cao như vậy không? Tôi thực sự đánh giá cao bất kỳ đề xuất / trợ giúp nào để tối ưu hóa SOQL này.
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];
Tái bút: Tôi đã hỏi nhóm Biz liệu chúng tôi có thể chỉ có một trường # điện thoại trong khi so sánh hay không. Nhưng họ kiên quyết với năm lĩnh vực.
Trả lời
Thay vào đó, đây là trường hợp sử dụng hoàn hảo cho SOSL. Bạn có thể làm:
FIND :phoneNumber
IN PHONE FIELDS
RETURNING Account(
Id
WHERE RecordType.Name='Person Account'
ORDER BY CreatedDate
LIMIT 1
)
Lưu ý: Nếu bất kỳ trường tùy chỉnh nào là trường công thức, thì phương pháp này sẽ bỏ sót các bản ghi đó, vì các trường công thức không được lập chỉ mục tìm kiếm. Bạn cần thực sự sao chép các giá trị xuống bản ghi đang được tìm kiếm vì lý do hiệu suất.
Nhân tiện, tuyên bố này vẫn đúng với SOQL; bạn cần thực hiện truy vấn có chọn lọc, có nghĩa là không sử dụng các trường công thức. Miễn là tất cả các trường được lọc đều được lập chỉ mục, thì truy vấn ban đầu của bạn sẽ không thành vấn đề, ngay cả ở 15 triệu bản ghi khối lượng dữ liệu.