Mentre la tua logica e le soluzioni superiori sono buone per la piccola scala, se parli di più di 65000 elementi, hai bisogno di una soluzione che sia scalabile.
Il mio suggerimento è di dividere questa attività in 2 passaggi.
Passaggio 1
Crea una tabella temporanea, questa tabella temporanea avrà un minimo di 3 colonne
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Ogni volta che l'utente ordina una tale query, inserire i dati, ovvero gli ID degli elementi e il loro numero di sequenza in questa tabella temporanea con una chiave univoca per identificare la sessione dell'utente (possibilmente ID utente o ID sessione). Questo trucco consiste nell'evitare la collisione degli elenchi di elementi quando più utenti inviano rapporti contemporaneamente.
Passaggio 2
Ora attiva la query del rapporto unendo la tua tabella principale, tabella temporanea con session_key
. Nei dati dell'ordine di query in base al tuo ordine di input (già archiviato nella tabella temporanea)
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
Questo metodo è
- indipendente dal database
- scalabile con qualsiasi numero di input
- Offre le migliori prestazioni possibili
Nota:per migliorare ulteriormente le prestazioni della query, crea l'indice su session_key, item_id nella tabella temporanea crea anche l'indice su item_id sulla tabella ITEM (se non esiste già)
Modifica:Oracle offre Tabella temporanea globale funzionalità, che crea funzionalità per consentire i record solo con in sessione e la pulizia automatica al momento del commit/fine della sessione ecc. È possibile utilizzare questa funzione ed evitare la chiave di sessione, ma questa soluzione non può essere replicata su altri prodotti di database a meno che non supporta funzionalità simili.