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で効率化
・インデックス意識