Salesforce のSOQL
ここ理解してない人、めちゃくちゃ多い。
でも実務ではここが一番差になる。
SOQLの基本思想
SQLとの違い:
・JOINが制限される
・ガバナ制限あり
・インデックス重要
絶対NGパターン
① SOQL in ループ
for (Account acc : accounts) {
Contact[] cons = [SELECT Id FROM Contact WHERE AccountId = :acc.Id];
}
👉 即ガバナ制限
正しい書き方
Set<Id> accountIds = new Set<Id>();
for (Account acc : accounts) {
accountIds.add(acc.Id);
}
List<Contact> cons = [
SELECT Id, AccountId
FROM Contact
WHERE AccountId IN :accountIds
];
Map活用が鍵
Map<Id, List<Contact>> contactMap = new Map<Id, List<Contact>>();
これで:
👉 O(n²) → O(n) に改善
Selectivity(選択性)
WHERE条件が雑だと死ぬ。
NG:
WHERE Name != null
OK:
WHERE Status__c = 'Active'
👉 インデックス使える条件にする
LIMITの重要性
SELECT Id FROM Account LIMIT 100
→ 無駄なデータ取得防止
実務テクニック
・必要な項目だけSELECT
・WHEREで絞る
・ORDER BY + LIMITで最小取得
・COUNT()活用
まとめ
・SOQLは回数より“質”
・ループ内禁止
・Mapで効率化
・インデックス意識
