Salesforce検索性能の本質はこの3つ:
1.インデックスを使う
2.検索対象を減らす(選択性)
3.全件スキャンを避ける
🔧 1. インデックス最適化
❌ 悪い例
SELECT Id FROM Account
WHERE Status__c = 'Active'
👉 Status__c にインデックスなし → 全件スキャン(遅い)
✅ 改善例
👉 Status__c にカスタムインデックスを付与
SELECT Id FROM Account
WHERE Status__c = 'Active'
📌 効果:数秒 → 数百ms
❌ 選択性が低い条件
WHERE IsActive__c = true -- 90%がtrue
✅ 改善
WHERE IsActive__c = true
AND CreatedDate = LAST_N_DAYS:30
👉 対象件数を減らす(選択性UP)
🔍 2. LIKE検索の最適化
❌ 悪い例
WHERE Name LIKE '%ABC%'
👉 前後ワイルドカード → インデックス効かない
✅ 改善例
WHERE Name LIKE 'ABC%'
👉 前方一致 → インデックス使用可能
💡 業務例
顧客名検索
👉「前方一致検索」に変更すると高速化
📊 3. データ量のコントロール
❌ 悪い例
Account:500万件
全データ検索
```java
SELECT Id FROM Account
WHERE Status__c = 'Active'
✅ 改善例(アーカイブ)
SELECT Id FROM Account
WHERE Status__c = 'Active'
AND CreatedDate = LAST_N_YEARS:2
👉 古いデータを別オブジェクトへ移動
🧠 4. SOSLとSOQLの使い分け
❌ 悪い例(SOQLで全文検索)
SELECT Id FROM Contact
WHERE Name LIKE '%John%'
OR Email LIKE '%John%'
✅ 改善例(SOSL)
FIND 'John' IN ALL FIELDS RETURNING Contact(Id, Name)
👉 全文検索はSOSLの方が高速
🖥️ 5. 画面(UI)の最適化
❌ 悪い例
リストビューに20項目表示
数式項目が多い
✅ 改善
表示項目を5〜8個に削減
数式項目を減らす
❌ Apex呼び出し多すぎ
connectedCallback() {
loadApex1();
loadApex2();
loadApex3();
}
✅ 改善
connectedCallback() {
Promise.all([loadApex1(), loadApex2()]);
}
👉 通信回数削減
⚙️ 6. Query Planの確認
❌ 悪い例
WHERE Status__c = 'Active'
👉 Cost高い・Index未使用
✅ 改善
WHERE Status__c = 'Active'
AND CreatedDate = LAST_N_DAYS:30
👉 Cost低下・Index使用
🚀 7. OR条件の改善
❌ 悪い例
WHERE Status__c = 'Active'
OR Status__c = 'Pending'
✅ 改善
WHERE Status__c IN ('Active', 'Pending')
👉 インデックス効きやすい
🔥 8. 数式項目の注意
❌ 悪い例
WHERE Score__c > 80 -- 数式項目
👉 インデックス不可
✅ 改善
👉 通常項目に保存
WHERE ScoreStored__c > 80
⚠️ 9. データスキュー
❌ 悪い例(Owner Skew)
50万件が同一ユーザ
WHERE OwnerId = 'xxx'
✅ 改善
Owner分散
Queue利用
💡 10. 実務でよくある改善例
❌ 改善前
SELECT Id FROM Opportunity
WHERE Name LIKE '%test%'
AND StageName = 'Closed Won'
✅ 改善後
SELECT Id FROM Opportunity
WHERE Name LIKE 'test%'
AND StageName = 'Closed Won'
AND CloseDate = THIS_YEAR
🏢 会社情報
有楽テック合同会社
公式サイト:https://yuraku-tech.jp
Salesforce開発・支援などお気軽にご相談ください。