Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle 12c - индексът на колона „number“ работи ли по-бързо от индекса на колона „varchar“?

[TL;DR] Използвайте дати за съхраняване на дати, числа за съхраняване на числа и низове за съхраняване на низове.

Oracle съхранява NUMBER тип данни като 1 байт на 2 цифри.

Oracle съхранява CHAR тип данни като 1 байт на ASCII знак (UTF-8 и други кодировки може да отнемат повече за знаци в разширени набори) и ще допълни низа отдясно със знаци за интервал, така че всички низове да са с еднаква дължина.

Oracle съхранява VARCHAR2 тип данни като 1 байт на ASCII знак плюс малка надбавка (1 или 2 байта) за дължината на низа.

Oracle съхранява DATE тип данни като 7 байта (2 за година и 1 за всеки месец, ден, час, минута, секунда).

Въз основа на ваш предишен въпрос изглежда, че съхранявате year и quarter и ако приемем, че винаги ще имате 4-цифрени години и 1-цифрени тримесечия, тогава:

  • NUMBER(5,0) ще отнеме 3 байта;
  • CHAR(5 CHARACTER) ще отнеме 5 байта;
  • VARCHAR2(5 CHARACTER) ще отнеме 6 байта; и
  • DATE ще отнеме 7 байта.

Така че само паметта се разглежда като NUMBER(5,0) би било най-ефективно.

Въпреки това

Веднага след като започнете да правите аритметика на година/тримесечия, съхранени като числа/низове, тогава ще изпаднете в проблеми с производителността:

Например получаване на следващото тримесечие:

  • Ако quarter е NUMBER тип данни, тогава можете да използвате:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END но това не работи, когато искате да добавите 5 четвърти или да започнете да изваждате четвърти и тогава логиката започва да става много по-сложна.
  • Ако quarter е CHAR тип данни, тогава бихте могли да ги конвертирате в число или дата и да използвате някой от тези методи (манипулирането на низове вероятно няма да бъде ефективно).
  • Ако quarter е DATE тогава просто трябва да използвате ADD_MONTHS( quarter, 3 ) .

DATE методът е самодокументиращ се и вече съществува, докато NUMBER просто ще се превърне в персонализирана функция за вашето приближение на QUARTER тип данни и след като приложите всички функции за сравнение и манипулиране, от които се нуждаете, ефективно ще пренапишете DATE тип данни като UDT за тримесечия и тези функции ще бъдат по-малко ефективни от оптимизираните функции за дата.

Не използвайте неподходящи типове данни - просто съхранявайте датите като дати; числата като числа; и низове като низ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle йерархична клауза за стартиране на заявка от присъединяване

  2. Получаване на ORA-02391:Ограничение за SESSIONS_PER_USER

  3. Използване на oci_parse и oci_execute

  4. Най-добрият начин за масово вмъкване на данни в база данни на Oracle

  5. Oracle - в този обхват не съществува функция с име X