sql >> データベース >  >> RDS >> Oracle

Oracle12c-「number」列のインデックスは「varchar」列のインデックスよりも高速に実行されますか?

    [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としてのデータ型とそれらの関数は、最適化された日付関数よりもパフォーマンスが低くなります。

    不適切なデータ型を使用しないでください。日付を日付として保存するだけです。数字としての数字;文字列としての文字列。




    1. postgresqlでコピーを使用していますか?

    2. PythonはMySQLのプリペアドステートメントをサポートしていますか?

    3. ユーロとドルの記号をmysqlの列に挿入します

    4. フェッチしたデータをsocket.ioストリームに送信できませんか?