Mens din logik og ovenstående løsninger er gode til småskala, hvis du taler om mere end 65.000 varer, har du brug for en løsning, der er skalerbar.
Mit forslag er at dele denne opgave op i 2 trin.
Trin 1
Opret en midlertidig tabel. Denne midlertidige tabel vil have mindst 3 kolonner
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Hver gang brugeren bestiller en sådan forespørgsel, indsæt data, dvs. vare-id'er og deres sekvensnummer i denne midlertidige tabel med en unik nøgle til at identificere brugersession (muligvis bruger-id eller session-id). Dette trick er at undgå kollision af emnelister, når flere brugere affyrer rapporter samtidigt.
Trin 2
Affyr nu din rapportforespørgsel ved at slutte sig til din hovedtabel, midlertidige tabel med session_key
. I forespørgselsrækkefølgen er data baseret på din inputordre (lagret i midlertidig tabel allerede)
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
Denne metode er
- databaseagnostiker
- skalerbar med et vilkårligt antal input
- Giver bedst mulig ydeevne
Bemærk:For yderligere at forbedre forespørgselsydeevnen skal du oprette indeks på session_key, item_id i temp-tabellen også oprette indeks på item_id på ITEM-tabellen (hvis det ikke allerede eksisterer)
Edit:Oracle tilbyder Global midlertidig tabel funktion, som opretter har funktioner til kun at tillade poster med i session og automatisk oprydning ved commit/afslutning af session osv. Du kan gøre brug af denne funktion og undgå sessionsnøgle, men denne løsning kan ikke replikeres på andre databaseprodukter, medmindre de understøtter lignende funktion.