How to deal with high volume data

1. Contact Salesforce.com if you know your organization will be using high volume account or contact data

High volume data = Account or Contact data over 200,000

If your organisation goes over this number of records, you may get an error message along the lines of "Non-selective query against large object type (more than 200,000 rows). Consider an indexed filter or contact salesforce.com about custom indexing."

2. Request custom indexing for the following fields:

Contact Salesforce support through help & training link at the top right, then log a case.  Request for Custom Indexing to be added to the following fields.  Mention this is part of a managed package "Payments2Us"

  • Accounts: AAkPay__ Account_Search_Name__c
  • Contacts: AAkPay__ Phone_Search__c, AAkPay__MobilePhone_Search__c

3. If Salesforce Support insists on SOQL query being in use along with binding values if any.

Even though Salesforce support have done this quite a number of times before and their online help says to just ask for custom indexing if needed and support will add, they will often still insist on asking for "SOQL query being in use along with binding values if any.".

The first step is to remind then that this is a managed package and that the author has said salesforce has testing and tried this in the past and have always been granted the indexes being added.

If Salesforce Support still insist on the SOQL and binding details, then:

  1. In salesforce, locate a Payment Txn where this error is occurring.  Edit the Payment Txn, Change the status to “Matching Start” and SAVE.  This should set the status back to error.
  2. The SOQL is:
    Select Id,AAkPay__Fundraiser_ID__c, aakpay__Subscriber_Group__c, aakpay__Subscriber_Group__r.aakpay__Subscription__c, aakpay__Subscriber_Group__r.aakpay__Subscription__r.aakpay__Payment_Option__r.AAkPay__Subscription_Group_Type__c, aakpay__Subscriber_Group__r.aakpay__Subscription__r.aakpay__Payment_Option__r.aakpay__Payment_Type__c,  aakpay__Subscriber_Group__r.aakpay__Account_Subscription__c, aakpay__Subscriber_Group__r.aakpay__Account_Subscription__r.aakpay__Payment_Option__r.AAkPay__Subscription_Group_Type__c, aakpay__Subscriber_Group__r.aakpay__Account_Subscription__r.aakpay__Payment_Option__r.aakpay__Payment_Type__c,AccountId,  aakpay__Phone_Search__c, aakpay__MobilePhone_Search__c, Account.aakpay__Account_Search_Name__c, firstName,lastName, Account.aakpay__Membership_No__c, aakpay__Membership_No__c, email, Phone, MobilePhone, MailingCity, MailingStreet, MailingPostalCode from Contact where lastName in :lastNameKeys or email in :emailKeys or aakpay__mobilePhone_Search__c in: mobileKeys or Account.Membership_No__c in :membershipKeys or memberShip_No__c in :membershipKeys limit :maxRows
  3. For the binding values,  On the Payment Txn locate the related field and provide those values.
  • lastNameKeys (last name on payment txn)
  • emailKeys (email  on payment txn)
  • mobileKeys (mobile on payment txn)
  • membershipKeys (membership No on payment txn)
  • maxRows would be about 20000

    If any of the above is blank, it WILL NOT be included as part of the query.

You can provide Salesforce with a link to the Payment Txn in step 1 above and instructions on how to do this.

After the indexes have been added, you can change the Payment Txn Status to "Matching Start" to complete the processing of those items that were in error.

4. If custom indexing is not set up, check for the following error message

Error Message: “System.QueryException: Non-selective query against large object type (more than 200000 rows). Consider an indexed filter or contact salesforce.com about custom indexing.”

Whilst waiting for Salesforce support, you can select "Disable custom indexing" checkbox on the Merchant Facility.  Remove this after custom indexing has been added as matching/de-duplication will not be as effective.