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

Oracle 12c – funguje index ve sloupci „číslo“ rychleji než index ve sloupci „varchar“?

[TL;DR] Používejte data k ukládání dat, čísla k ukládání čísel a řetězce k ukládání řetězců.

Oracle ukládá NUMBER datový typ jako 1 bajt na 2 číslice.

Oracle ukládá CHAR datový typ jako 1 bajt na znak ASCII (kódování UTF-8 a další kódování může trvat déle pro znaky v rozšířených sadách) a doplní řetězec vpravo mezerami, takže všechny řetězce budou přesně stejně dlouhé.

Oracle ukládá VARCHAR2 datový typ jako 1 bajt na znak ASCII plus malá režie (1 nebo 2 bajty) pro délku řetězce.

Oracle ukládá DATE datový typ jako 7 bajtů (2 pro rok a 1 pro každý měsíc, den, hodinu, minutu, sekundu).

Na základě vašeho předchozího dotazu zdá se, že ukládáte year a quarter a za předpokladu, že budete mít vždy čtyřciferné roky a jednociferné čtvrtletí:

  • NUMBER(5,0) bude trvat 3 bajty;
  • CHAR(5 CHARACTER) by trvalo 5 bajtů;
  • VARCHAR2(5 CHARACTER) zabere 6 bajtů; a
  • DATE zabere 7 bajtů.

Tedy pouze uvažovat paměť jako NUMBER(5,0) by bylo nejúčinnější.

Nicméně

Jakmile začnete provádět aritmetiku pro rok/čtvrtletí uložené jako čísla/řetězce, dostanete se do problémů s výkonem:

Například získání dalšího čtvrtletí :

  • Pokud quarter je NUMBER datový typ, pak byste mohli použít:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END ale tohle nejde, když chcete přidat 5 čtvrtin nebo začít odečítat čtvrtiny a pak se logika začne mnohem komplikovat.
  • Pokud quarter je CHAR datový typ, pak jej můžete převést na číslo nebo datum a použít některou z těchto metod (manipulace s řetězci pravděpodobně nebude účinná).
  • Pokud quarter je DATE pak stačí použít ADD_MONTHS( quarter, 3 ) .

DATE metoda je samodokumentující a již existuje, zatímco NUMBER metoda by se jen stala vlastní funkcí pro vaši aproximaci QUARTER datový typ a jakmile implementujete všechny potřebné porovnávací a manipulační funkce, efektivně přepíšete DATE datový typ jako UDT pro čtvrtletí a tyto funkce budou méně výkonné než funkce optimalizovaného data.

Nepoužívejte nevhodné datové typy – pouze ukládejte data jako data; čísla jako čísla; a řetězce jako řetězec.




  1. STRING_SPLIT v MySql – jak na to?

  2. Oracle to PostgreSQL:Syntaxe vnějšího spojení ANSI v PostgreSQL

  3. Synchronizace dat mezi MySQL a MongoDB

  4. Jak zkontroluji duplicitní hodnoty sloupců v tabulce, než je vložím pomocí Perlu?