SELECT id FROM A LEFT OUTER JOIN B ON A.id=B.id WHERE B.id IS NULL
Puoi farlo. il join esterno dovrebbe portare un po' di prestazioni, ma non molto.
i nuovi sistemi di database probabilmente ottimizzeranno comunque la tua query in modo che non ci siano differenze.
il modo corretto qui è la memorizzazione nella cache! prova la cache delle query e la memorizzazione nella cache a livello di applicazione, se possibile.
ovviamente hai bisogno di indici adeguati.
e per corretto intendo su entrambe le tabelle e preferibilmente un indice hash in quanto avrà un tempo di ricerca statico rispetto a qualsiasi albero che abbia logaritmico
Prova a inserire una spiegazione prima della query per vedere cosa lo rallenta davvero.
se hai davvero bisogno che questo sia veloce potresti ricostruire la struttura dei tuoi dati.
potresti eventualmente creare un trigger per contrassegnare un flag nella tabella A se esiste una voce corrispondente nella tabella. ovviamente questa ridondanza dei dati identificativi, ma a volte ne vale la pena. pensalo solo come una memorizzazione nella cache.
un ultimo pensiero:potresti provare SELECT id FROM A WHERE id NOT IN (SELECT id FROM B)
potrebbe essere un po' più veloce perché non è necessario unire effettivo, tuttavia potrebbe anche essere più lento perché la ricerca nel set di essere sarà una scansione completa. Non sono sicuro di come verrà elaborato, ma potrebbe valere la pena provare.