Chociaż Twoja logika i powyższe rozwiązania są dobre dla małej skali, jeśli mówisz o ponad 65 000 elementów, potrzebujesz rozwiązania, które jest skalowalne.
Proponuję podzielić to zadanie na 2 kroki.
Krok 1
Utwórz tabelę tymczasową,Ta tabela tymczasowa będzie miała minimum 3 kolumny
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Za każdym razem, gdy użytkownik zleca takie zapytanie, wstaw dane, tj. identyfikatory pozycji i ich kolejność nr do tej tabeli tymczasowej, z pewnym unikalnym kluczem do identyfikacji sesji użytkownika (ewentualnie identyfikator użytkownika lub identyfikator sesji). Ta sztuczka polega na unikaniu kolizji list pozycji, gdy wielu użytkowników jednocześnie zgłasza zgłoszenia.
Krok 2
Teraz uruchom zapytanie raportu łączące główną tabelę, tabelę tymczasową za pomocą session_key
. W kolejności zapytań dane oparte na kolejności wprowadzania danych (zapisane już w tabeli tymczasowej)
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
Ta metoda to
- niezależny od bazy danych
- skalowalny z dowolną liczbą wejść
- Zapewnia najlepszą możliwą wydajność
Uwaga:Aby jeszcze bardziej poprawić wydajność zapytania, utwórz indeks na session_key, item_id w tabeli tymczasowej, utwórz również indeks na item_id na tabeli ITEM (jeśli jeszcze nie istnieje)
Edycja:Oracle oferuje Globalny tabelę tymczasową funkcja, która tworzy, ma funkcje zezwalające tylko na zapisy w sesji i automatyczne czyszczenie po zatwierdzeniu/zakończeniu sesji itp. Możesz skorzystać z tej funkcji i uniknąć klucza sesji, ale to rozwiązanie nie może być replikowane na innych produktach bazodanowych, chyba że obsługuje podobną funkcję.