Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle 12c - Ist der Index für eine Spalte „Zahl“ schneller als der Index für eine Spalte „Varchar“?

[TL;DR] Verwenden Sie Daten zum Speichern von Daten, Zahlen zum Speichern von Zahlen und Zeichenfolgen zum Speichern von Zeichenfolgen.

Oracle speichert die NUMBER Datentyp als 1 Byte pro 2 Ziffern.

Oracle speichert den CHAR Datentyp als 1 Byte pro ASCII-Zeichen (UTF-8 und andere Codierungen benötigen möglicherweise mehr für Zeichen in erweiterten Sätzen) und füllt die Zeichenfolge rechts mit Leerzeichen auf, sodass die Zeichenfolgen alle genau dieselbe Länge haben.

Oracle speichert den VARCHAR2 Datentyp als 1 Byte pro ASCII-Zeichen plus einen kleinen Overhead (1 oder 2 Bytes) für die Stringlänge.

Oracle speichert das DATE Datentyp als 7 Bytes (2 für Jahr und 1 für Monat, Tag, Stunde, Minute, Sekunde).

Basierend auf Ihrer vorherigen Frage Sie scheinen year zu speichern und quarter und unter der Annahme, dass Sie immer 4-stellige Jahreszahlen und 1-stellige Quartalsangaben haben werden:

  • NUMBER(5,0) würde 3 Byte nehmen;
  • CHAR(5 CHARACTER) würde 5 Byte nehmen;
  • VARCHAR2(5 CHARACTER) würde 6 Bytes nehmen; und
  • DATE würde 7 Byte nehmen.

Also nur Berücksichtigung des Speichers a NUMBER(5,0) wäre am effizientesten.

Allerdings

Sobald Sie anfangen, mit Jahr/Quartal, die als Zahlen/Strings gespeichert sind, zu rechnen, treten Leistungsprobleme auf:

Beispiel:Abrufen des nächsten Quartals :

  • Bei quarter ist eine NUMBER Datentyp, dann könnten Sie verwenden:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END Dies funktioniert jedoch nicht, wenn Sie 5 Viertel addieren oder Viertel subtrahieren möchten und die Logik dann viel komplizierter wird.
  • Bei quarter ist ein CHAR Datentyp, dann könnten Sie ihn in eine Zahl oder ein Datum umwandeln und eine dieser Methoden verwenden (String-Manipulation ist wahrscheinlich nicht performant).
  • Bei quarter ist ein DATE dann müssen Sie nur ADD_MONTHS( quarter, 3 ) verwenden .

Das DATE Methode ist selbstdokumentierend und existiert bereits, während NUMBER -Methode würde nur eine benutzerdefinierte Funktion für Ihre Annäherung an ein QUARTER werden Datentyp und sobald Sie alle Vergleichs- und Manipulationsfunktionen implementiert haben, die Sie benötigen, haben Sie das DATE effektiv umgeschrieben Datentyp als UDT für Quartale und diese Funktionen sind weniger leistungsfähig als die optimierten Datumsfunktionen.

Verwenden Sie keine unangemessenen Datentypen - speichern Sie Daten einfach als Daten; Zahlen als Zahlen; und Zeichenfolgen als Zeichenfolge.