2011-08-16 8 views
0

私は既知のGUIDを保存して取得してレコードを追加した後、レコードのIDを取得するデータベースに取り組んでいます。私のアプリケーションはSQL ServerとOracleの両方で動作するので、@@ IDENTITY *は使用できません。テーブルを更新するためにGUID列が使用されました。インデックスを作成する必要がありますか?

言ってやる例えば、私は新しいアドレスを追加します

ID (identity column in SQL Server;sequenced/trigger column in Oracle) 
... address data... (street, town, postcode, etc.) 
GUID 

私は次のようにしてIDを取り戻す:パート1で

1. INSERT INTO ADDRESS (... address details, GUID = {some new GUID value}) 
2. SELECT ID FROM ADDRESS WHERE GUID = {my GUID value} 
3. UPDATE ADDRESS SET GUID = NULL WHERE GUID = {my GUID value} 

を、私はアドレスの詳細を追加していると、データベースにGUID値を設定する。パート2でIDを取得しています。パート3では、GUID値をデータベースから削除しています(重複したGUIDが発生することはほとんどありません)。

私は3番目のビットのためのSQL Server 2008の推定実行プランを見てみると、私はGUID列にはインデックスがない場合、それは次のパスを示しています

Image shows the estimated execution plan where there's no index on the GUID column

と次のパスI場合をGUID列に索引を持っている:

Image shows the estimated execution plan where there's an index on the GUID column

私の質問です:私は2番目の画像に示すシークとして最初の画像に示されているスキャンが良くないことを認識しますが、 GUID列が本質的に空の99.999%ということは、常に断片化されリソースを浪費するため、フィールドのインデックスを作成すべきではないということですか?それとも、インデックス全体のスキャンを行う必要がなく、私が追加したばかりのGUIDがどこにあるのかがわかりやすいので、インデックスはまだ役立ちますか?

要約:GUIDが追加され、すぐに削除されるという事実を考えれば、GUID列のインデックス作成には何らかのポイントがありますか?

*デザインは自分のものではないため、別の方法を使用することはできません。しかし、私の特定のデータベースの設計が私の全体的な質問に影響しないことがわかります。

+0

SQLでは、NEWIDを使用して新しいGUIDを選択できます。 NEWIDはランダムであるため、索引のバイナリ・ツリーのどこにでも表示できるため、NEWIDと索引付けには問題があります。 http://msdn.microsoft.com/en-us/library/ms190348.aspx – David

+0

ID列の値を受け取るためにこのような手法を使用していますか? MSのSQLと私はあまりにも多くの便利で迅速なIDを取得する方法がありますOracleで信じている。 OracleとMS SQL – elevener

答えて

2

はい、あなたは何をしているのかについて列をインデックス化する必要があります。

create index AddressGuid on ADDRESS(GUID) where GUID is not NULL; 

しかし、教唆者方法があります:SQL Serverの(Oracleの同等物が何であるかわからない)でフィルタリングインデックスを使用してINSERTのRETURNING句/ OUTPUTを使用しています。 SQL ServerOracleの両方がサポートされており、GUIDの回避策は必要ありません。

+0

偉大な、そして、速い応答のためのありがとう!私は間違いなくアウトプット/リターン句をチェックアウトします。私はある程度の影響力を持っているので、それは将来私たちが取ることのできる方向かもしれません。 – LordScree

+0

こんにちはRamusさん、さらに読んだ後に、OracleのRETURNING INTO節はOracle 10g以上でしかサポートされていないようです。なぜなら、私たちはそれを使用できない理由です(=ありがとうと思います。顧客はOracle 9iから移行します。 – LordScree

+0

実際、Oracle 9iデータベースに関する独自の調査を行った後、RETURNING INTOはうまくいきます...今、私は非常に混乱しています。 – LordScree

0

その列にインデックスを作成しない場合は、SELECTおよびUPDATEステートメントのそれぞれは、行を見つけるためにテーブル全体をスキャンする必要があります。それがあなたが望むものでないなら、あなたは索引をつけなければなりません。私はGUID列をNULLに設定するのは気にしません。

+0

おかげでGabeのための別のテクニックでレコードの追加のためにストアドプロシージャを使用してください。興味深いことに、質問を投稿する直前にGUID列をnullに設定する理由について、テクニカルリードと話し合いました。私はそれについてあなたに同意すると言いたいのですが、うまくいけば私たちはRemusの出力/提案を最終的に使うことに向かって行きます。 – LordScree

関連する問題