Gå til top 20. Hvis de ikke opfylder kravene, så lav en ekstra forespørgsel for at få de manglende brikker. Du bør være i stand til at finde en balance mellem antallet af forespørgsler og antallet af rækker, som hver returnerer.
Hvis du fik top 100, ville det muligvis opfylde kravene 90 % af tiden og ville være billigere og hurtigere end 10 separate forespørgsler.
Hvis det var SQL Server, kunne jeg hjælpe mere...
Faktisk har jeg en anden idé. Kør en proces hvert 5. minut, der beregner listen og cacher den i en tabel. Få DML mod relaterede tabeller til at ugyldiggøre cachen, så den ikke bruges, før den er genudfyldt (måske er en artikel blevet slettet). Hvis cachen er ugyldig, ville du falde tilbage til at beregne den med det samme... Og kunne bruge det til at genudfylde cachen alligevel.
Det kan være muligt strategisk at opdatere den cachelagrede liste i stedet for at genberegne den. Men det kunne være en rigtig udfordring.
Dette skulle hjælpe både med forespørgselshastigheden og reducere belastningen på din database. Det burde ikke have den store betydning, hvis din artikelliste er 5 minutter forældet. For pokker, selv 1 minut kan fungere.