SELECT id FROM A LEFT OUTER JOIN B ON A.id=B.id WHERE B.id IS NULL
você consegue fazer isso. a junção externa deve trazer um pouco de desempenho, mas não muito.
novos sistemas de banco de dados provavelmente otimizarão sua consulta de qualquer maneira para que não haja nenhuma diferença.
a maneira correta aqui é cache! tente o cache de consulta e o cache de nível de aplicativo, se possível.
é claro que você precisa de índices adequados.
e por apropriado quero dizer em ambas as tabelas e de preferência um índice de hash, pois terá tempo de pesquisa estático em comparação com qualquer árvore que tenha logarítmica
Tente colocar uma explicação antes da consulta para ver o que realmente diminui isso.
se você realmente precisa que isso seja rápido, você pode reformular sua estrutura de dados.
você poderia criar um gatilho para marcar um sinalizador na tabela A se houver uma entrada correspondente na tabela ser. é claro que essa redundância de dados de identificação, mas às vezes vale a pena. apenas pense nisso como cache.
um último pensamento:você pode tentar
SELECT id FROM A WHERE id NOT IN (SELECT id FROM B)
pode ser um pouco mais rápido porque nenhuma junção real é necessária, mas também pode ser mais lenta porque a pesquisa no conjunto de be será uma varredura completa. Não tenho certeza de como isso será processado, mas pode valer a pena tentar.