Zatímco vaše logika a výše uvedená řešení jsou dobrá pro malé měřítko, pokud mluvíte o více než 65 000 položkách, potřebujete řešení, které je škálovatelné.
Můj návrh je rozdělit tento úkol na 2 kroky.
Krok 1
Vytvořte dočasnou tabulku, tato dočasná tabulka bude mít minimálně 3 sloupce
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Pokaždé, když uživatel objedná takový dotaz, vložte data, tj. ID položek a jejich sekvenci no do této dočasné tabulky s nějakým jedinečným klíčem k identifikaci uživatelské relace (možná ID uživatele nebo ID relace). Tento trik má zabránit kolizi seznamů položek, když několik uživatelů současně spustí hlášení.
Krok 2
Nyní spusťte dotaz sestavy a spojte svou hlavní tabulku, dočasnou tabulku s session_key
. V dotazu data objednávky na základě vaší vstupní objednávky (již uložená v dočasné tabulce)
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
Tato metoda je
- databázový agnostik
- škálovatelné s libovolným počtem vstupů
- Poskytuje nejlepší možný výkon
Poznámka:Chcete-li dále zlepšit výkon dotazů, vytvořte index pro session_key, item_id v dočasné tabulce také vytvořte index pro item_id v tabulce ITEM (pokud již neexistuje)
Edit:Oracle nabízí Globální dočasný stůl funkce, která vytváří, má funkce umožňující záznamy pouze v relaci a automatické čištění při odevzdání/konci relace atd. Tuto funkci můžete využít a vyhnout se klíči relace, ale toto řešení nelze replikovat na jiné databázové produkty, pokud podporovat podobnou funkci.