sql >> Database >  >> RDS >> Oracle

Oracle 12c - presteert de index op een 'nummer'-kolom sneller dan de index op de 'varchar'-kolom?

[TL;DR] Gebruik datums om datums op te slaan, getallen om getallen op te slaan en tekenreeksen om tekenreeksen op te slaan.

Oracle slaat het NUMBER op gegevenstype als 1 byte per 2 cijfers.

Oracle slaat de CHAR . op gegevenstype als 1 byte per ASCII-teken (UTF-8 en andere coderingen kunnen meer nodig hebben voor tekens in uitgebreide sets) en zal de tekenreeks met spatietekens naar rechts opvullen, zodat de tekenreeksen allemaal exact dezelfde lengte hebben.

Oracle slaat de VARCHAR2 . op datatype als 1 byte per ASCII-teken plus een kleine overhead (1 of 2 bytes) voor de stringlengte.

Oracle slaat de DATE op gegevenstype als 7 bytes (2 voor jaar en 1 voor maand, dag, uur, minuut, seconde).

Gebaseerd op je vorige vraag je lijkt year op te slaan en quarter en ervan uitgaande dat je altijd 4-cijferige jaren en 1-cijferige kwartalen hebt, dan:

  • NUMBER(5,0) zou 3 bytes in beslag nemen;
  • CHAR(5 CHARACTER) zou 5 bytes in beslag nemen;
  • VARCHAR2(5 CHARACTER) zou 6 bytes in beslag nemen; en
  • DATE zou 7 bytes in beslag nemen.

Dus alleen beschouwend geheugen als een NUMBER(5,0) zou het meest efficiënt zijn.

Echter

Zodra je begint te rekenen met jaar/kwartalen die zijn opgeslagen als getallen/tekenreeksen, krijg je prestatieproblemen:

Bijvoorbeeld het volgende kwartaal ontvangen:

  • Als quarter is een NUMBER datatype dan zou je kunnen gebruiken:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END maar dit werkt niet als je 5 kwartalen wilt optellen of kwartalen wilt aftrekken en dan wordt de logica veel gecompliceerder.
  • Als quarter is een CHAR gegevenstype, dan kunt u het converteren naar een getal of een datum en een van deze methoden gebruiken (het manipuleren van strings is waarschijnlijk niet effectief).
  • Als quarter is een DATE dan hoef je alleen maar ADD_MONTHS( quarter, 3 ) . te gebruiken .

De DATE methode is zelfdocumenterend en bestaat al, terwijl de NUMBER methode zou gewoon een aangepaste functie worden voor uw benadering van een QUARTER gegevenstype en zodra u alle benodigde vergelijkings- en manipulatiefuncties hebt geïmplementeerd, hebt u de DATE effectief herschreven gegevenstype als een UDT voor kwartalen en die functies zullen minder presteren dan de geoptimaliseerde datumfuncties.

Gebruik geen ongepaste gegevenstypen - sla datums gewoon op als datums; nummers als nummers; en strings als string.




  1. PostgreSQL - items ophalen in de volgorde waarin ze zijn opgeslagen

  2. mysql herstel ongeldige datums

  3. MySQL Dynamic Query Statement in Python

  4. Oracle-reeks voor een primaire-sleutelveld haalt de momenteel ingevoegde waarde niet op in de slaapstand