[TL; DR] 日付を使用して日付を格納し、数値を使用して数値を格納し、文字列を使用して文字列を格納します。
OracleはNUMBER
を格納します 2桁あたり1バイトのデータ型。
OracleはCHAR
を格納します データ型はASCII文字あたり1バイト(UTF-8およびその他のエンコーディングでは、拡張セットの文字の場合はさらに時間がかかる場合があります)で、文字列にスペース文字が右に埋め込まれるため、文字列はすべてまったく同じ長さになります。
OracleはVARCHAR2
を格納します ASCII文字ごとに1バイトと文字列長の小さなオーバーヘッド(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としてのデータ型とそれらの関数は、最適化された日付関数よりもパフォーマンスが低くなります。
不適切なデータ型を使用しないでください。日付を日付として保存するだけです。数字としての数字;文字列としての文字列。