web-dev-qa-db-ja.com

GUIDをOracleに保存するにはどうすればよいですか?

私はuniqueidentifierを持っているSQLサーバーの世界から来ています。 Oracleに同等のものはありますか?この列は頻繁にクエリされるため、パフォーマンスが重要です。

.NetでGUIDを生成しています。Oracleに渡します。いくつかの理由により、Oracleで生成できないため、シーケンスを使用できません。

45
Shaun Bowe
CREATE table test (testguid RAW(16) default SYS_GUID() ) 

このブログ は相対的なパフォーマンスを調査しました。

48
Turnkey

他の人が述べたように、数値シーケンスと比較してGUIDを使用するとパフォーマンスが低下します。とは言っても、「 SYS_GUID() 」という名前の関数があります。これは、生の同等物を提供するOracle 8i以降で利用可能です。

SQL> SELECT SYS_GUID() FROM DUAL;

SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5

フォーマットされたGUIDを返す関数を作成できます。

CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
    SELECT SYS_GUID() INTO guid FROM DUAL ;

    guid :=
        '{' || SUBSTR(guid,  1, 8) ||
        '-' || SUBSTR(guid,  9, 4) ||
        '-' || SUBSTR(guid, 13, 4) ||
        '-' || SUBSTR(guid, 17, 4) ||
        '-' || SUBSTR(guid, 21) || '}' ;

    RETURN guid ;
END GET_FORMATTED_GUID ;
/

したがって、交換可能な文字列を返します:

SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;

GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}

一部のOracleプラットフォームは、同様のGUIDの一意の値を返すことに注意する必要があります 前述のとおり Steven Feuerstein.

6
Erik Anderson

質問を適切に理解している場合は、dbに行を挿入するときに一意のIDを生成する必要があります。
これを行うには、sequenceを使用できます。 リンクはこちら
シーケンスを作成したら、次のように使用できます。

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
4
hamishmcn

RAW(16)は、uniqueidentifier MS SQLタイプの推奨される同等物です。

3
stolsvik

GUIDは、MSSQLのようにOracleで使用されるものではなく、NUMBERフィールド(nullと主キー以外)、シーケンス、および挿入するトリガー(すべてのテーブルに対して)を持つ傾向があります。

1

Oracleにはuniqueidentifierはありません。

RAW(苦痛の種)またはCHARを使用して、自分で実装できます。 CHARフィールドでJOINを実行すると、整数を使用した場合と比較して(おそらく40%も)低下するクエリのパフォーマンス。

分散/レプリケートされたデータベースを実行している場合、パフォーマンスヒットは価値があります。それ以外の場合は、整数を使用します。

0
MusiGenesis

Oracleを使用する一般的なプラクティスは、人工キーを作成することです。これは、数値として定義された列です。シーケンスを介して入力されます。主キー定義を介してインデックス付け/制約されます。

0
dacracot