私はuniqueidentifierを持っているSQLサーバーの世界から来ています。 Oracleに同等のものはありますか?この列は頻繁にクエリされるため、パフォーマンスが重要です。
.NetでGUIDを生成しています。Oracleに渡します。いくつかの理由により、Oracleで生成できないため、シーケンスを使用できません。
CREATE table test (testguid RAW(16) default SYS_GUID() )
このブログ は相対的なパフォーマンスを調査しました。
他の人が述べたように、数値シーケンスと比較して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.
質問を適切に理解している場合は、dbに行を挿入するときに一意のIDを生成する必要があります。
これを行うには、sequenceを使用できます。 リンクはこちら
シーケンスを作成したら、次のように使用できます。
INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
RAW(16)は、uniqueidentifier MS SQLタイプの推奨される同等物です。
GUIDは、MSSQLのようにOracleで使用されるものではなく、NUMBERフィールド(nullと主キー以外)、シーケンス、および挿入するトリガー(すべてのテーブルに対して)を持つ傾向があります。
Oracleにはuniqueidentifierはありません。
RAW(苦痛の種)またはCHARを使用して、自分で実装できます。 CHARフィールドでJOINを実行すると、整数を使用した場合と比較して(おそらく40%も)低下するクエリのパフォーマンス。
分散/レプリケートされたデータベースを実行している場合、パフォーマンスヒットは価値があります。それ以外の場合は、整数を使用します。
Oracleを使用する一般的なプラクティスは、人工キーを作成することです。これは、数値として定義された列です。シーケンスを介して入力されます。主キー定義を介してインデックス付け/制約されます。