Vá buscar os 20 primeiros. Se eles não atenderem aos requisitos, faça uma consulta adicional para obter as peças que faltam. Você deve ser capaz de encontrar algum equilíbrio entre o número de consultas e o número de linhas que cada uma retorna.
Se você obtiver o top 100, ele pode satisfazer os requisitos em 90% das vezes e seria mais barato e mais rápido do que 10 consultas separadas.
Se fosse SQL Server eu poderia ajudar mais...
Na verdade, tenho outra ideia. Execute um processo a cada 5 minutos que calcula a lista e a armazena em cache em uma tabela. Fazer o DML contra tabelas relacionadas invalidar o cache para que ele não seja usado até que seja preenchido novamente (talvez um artigo tenha sido excluído). Se o cache for inválido, você voltaria a calculá-lo na hora... E poderia usar isso para repovoar o cache de qualquer maneira.
Pode ser possível atualizar estrategicamente a lista em cache em vez de recalcular. Mas isso pode ser um verdadeiro desafio.
Isso deve ajudar na velocidade da consulta e na redução da carga em seu banco de dados. Não deve importar muito se sua lista de artigos estiver 5 minutos desatualizada. Heck, mesmo 1 minuto pode funcionar.