56

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

.Net で GUID を生成し、それを Oracle に渡します。いくつかの理由で、オラクルで生成できないため、シーケンスを使用できません。

4

7 に答える 7

62
CREATE table test (testguid RAW(16) default SYS_GUID() ) 

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

于 2008-09-30T16:27:23.847 に答える
8

他の人が述べているように、数値シーケンスと比較して 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 プラットフォームは、Steven Feuerstein によって指摘されているように、似ているが一意の GUID 値を返すことに注意する必要があります。

2020 年 11 月 3 日更新: 10g では、Oracle は正規表現関数のサポートを追加しました。これは、関数を使用して連結を簡素化できることを意味しREGEXP_REPLACE()ます。

REGEXP_REPLACE(
    SYS_GUID(),
    '([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})',
    '{\1-\2-\3-\4-\5}'
)

この式は、によって返された文字列値SYS_GUID()を 16 進数値の 5 つのグループに分割し、各グループの間に「-」を挿入して再構築します。

于 2009-10-07T21:21:27.463 に答える
4

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

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
于 2008-09-30T16:28:03.427 に答える
3

RAW(16) は明らかに、uniqueidentifier MS SQL 型に相当するものとして推奨されています。

于 2012-02-27T23:48:37.770 に答える
2

OracleではGUIDはMSSQLほど使用されていないため、NUMBERフィールド(nullおよび主キーではない)、シーケンス、および挿入時にトリガーを使用して(すべてのテーブルに対して)データを入力する傾向があります。

于 2008-10-06T19:38:05.373 に答える
1

Oracle には一意の識別子はありません。

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

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

于 2008-09-30T16:24:28.520 に答える
0

Oracle を使用する一般的な方法は、人工キーを作成することです。これは数値として定義された列です。シーケンスを介して移入されます。主キー定義を介して索引付け/制約されます。

于 2008-09-30T16:24:44.337 に答える