sql >> Databáze >  >> RDS >> Oracle

Dotaz Oracle používající „jako“ ve sloupci indexovaných čísel, špatný výkon

LIKE podmínka shody vzoru očekává, že typy znaků budou vidět jako operandy na levé i pravé straně. Když narazí na ČÍSLO, implicitně jej převede na znak. Váš dotaz 1 je v podstatě tiše přepsán na toto:

SELECT a1.*
  FROM people a1
 WHERE TO_CHAR(a1.id) LIKE '119%'
   AND ROWNUM < 5

To se děje ve vašem případě, a to je špatné ze dvou důvodů:

  1. Konverze se provádí pro každý řádek, což je pomalé;
  2. Vzhledem k funkci (ačkoli implicitní) v predikátu WHERE nemůže Oracle použít index na A1.ID sloupec.

Chcete-li to obejít, musíte provést jednu z následujících akcí:

  1. Vytvořte index založený na funkcích na A1.ID sloupec:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. Pokud potřebujete porovnat záznamy na prvních 3 znacích sloupce ID, vytvořte další sloupec typu NUMBER obsahující pouze tyto 3 znaky a použijte prostý = operátora.

  3. Vytvořte samostatný sloupec ID_CHAR typu VARCHAR2 a vyplňte jej TO_CHAR(id) . Indexujte jej a použijte místo ID ve vašem WHERE podmínka.

    Samozřejmě, pokud se rozhodnete vytvořit další sloupec na základě existujícího sloupce ID, musíte tyto 2 synchronizovat. Můžete to udělat v dávce jako jedna AKTUALIZACE nebo ve spouštěči ON-UPDATE, nebo přidat tento sloupec do příslušného Příkazy INSERT a UPDATE ve vašem kódu.



  1. Jak zajistím, aby databáze MySQL běžela zcela v paměti?

  2. Jak získat obrázky z tabulky s jinými texty sloupců pomocí PHP

  3. Generátory dat pro SQL server?

  4. připojit se k místnímu serveru MySQL přes socket