Hoewel uw logische en bovenstaande oplossingen goed zijn voor kleinschaligheid, heeft u een oplossing nodig die schaalbaar is als u het heeft over meer dan 65000 items.
Mijn suggestie is om deze taak op te splitsen in 2 stappen.
Stap 1
Maak een tijdelijke tabel, deze tijdelijke tabel heeft minimaal 3 kolommen
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Telkens wanneer een gebruiker een dergelijke zoekopdracht bestelt, voegt u gegevens in, d.w.z. item-ID's en hun volgnummer in deze tijdelijke tabel met een unieke sleutel om de gebruikerssessie te identificeren (mogelijk gebruikers-ID of sessie-ID). Deze truc is om botsing van itemlijsten te voorkomen wanneer meerdere gebruikers tegelijkertijd rapporten afvuren.
Stap 2
Vuur nu uw rapportquery toe aan uw hoofdtabel, tijdelijke tabel met session_key
. In de query bestelgegevens op basis van uw invoervolgorde (al opgeslagen in tijdelijke tabel)
SELECT
T1.* , T2.item_report_order
FROM ITEM T1, TEMP_ITEM_ORDER_TABLE T2
WHERE T1.ITEM_ID = T2.ITEM_ID
AND T2.session_key = :input_session_key
ORDER BY t2.item_report_order
Deze methode is
- database-agnostisch
- schaalbaar met een willekeurig aantal ingangen
- Geeft de best mogelijke prestatie
Opmerking:om de queryprestaties verder te verbeteren, maakt u een index op session_key, item_id in de tijdelijke tabel ook een index aan op item_id in de ITEM-tabel (als deze nog niet bestaat)
Bewerken:Oracle biedt Globale tijdelijke tabel functie, die functies creëert om records alleen toe te staan met in sessie en automatisch opschonen bij vastlegging/einde van sessie enz. U kunt deze functie gebruiken en sessiesleutel vermijden, maar deze oplossing kan niet worden gerepliceerd op andere databaseproducten tenzij ze soortgelijke functie ondersteunen.