Ve a por los 20 primeros. Si no cumplen los requisitos, haz una consulta adicional para conseguir las piezas que faltan. Debería poder llegar a un equilibrio entre la cantidad de consultas y la cantidad de filas que devuelve cada una.
Si obtuvo el top 100, podría satisfacer los requisitos el 90% del tiempo y sería más económico y rápido que 10 consultas separadas.
Si fuera SQL Server podría ayudar más...
En realidad, tengo otra idea. Ejecute un proceso cada 5 minutos que calcule la lista y la almacene en caché en una tabla. Haga que DML contra las tablas relacionadas invalide el caché para que no se use hasta que se vuelva a llenar (quizás se eliminó un artículo). Si el caché no es válido, volvería a calcularlo sobre la marcha... Y podría usar eso para repoblar el caché de todos modos.
Podría ser posible actualizar estratégicamente la lista almacenada en caché en lugar de volver a calcularla. Pero eso podría ser un verdadero desafío.
Esto debería ayudar tanto con la velocidad de consulta como con la reducción de la carga en su base de datos. No debería importar mucho si su lista de artículos está desfasada 5 minutos. Diablos, incluso 1 minuto podría funcionar.