web-dev-qa-db-ja.com

GUID varcharフィールドに格納

PKとしてGUIDを使用するいくつかのデータベースを継承しました。すべてのデータ型がuniqueidentifierである代わりに、ほとんどはvarchar(50)と一部のvarchar(100)です。フィールドはtrueですGUID一部の作成者

myID = 'xxx' + convert(varchar(40)、newID())

一般的にそれは少し混乱しています

この設計のパフォーマンスへの影響は何ですか。また、データ型を変換するためにテーブルを再作成する価値があります。テーブルは通常、約1/2 Mのレコードで、2〜4Mのレコード範囲に2つのテーブルがあります。

この質問の原動力は、24個のテーブルとビューを結合するプロシージャを最適化しようと(失敗)しており、サーバーがそれをうまく処理していないことです。

洞察をありがとう

3
Lance

一般に、クラスター化されたインデックスキーを長くすることはお勧めできません。そのため、キーがいくつかの短い列またはいくつかの長い列で構成されているかどうかは重要ではありません。これにより、すべてのインデックスのメンテナンスと、そのテーブルのすべてのインデックスの読み取りアクセスが、コストが非常に高くなります。 PKはデフォルトでクラスター化インデックスによって適用されるため、非常に長いクラスター化インデックスキーを持っている可能性があります。

また、一般に、クラスター化されたインデックスキーを単調に増加させることをお勧めします。 NEWIDに基づいて列が評価されるため、新しい行がテーブル全体に分散され、断片化が発生します。余分な長いキーは、これをさらに悪化させます。

そして最後に、一般に、事前にパフォーマンスをチューニングするのに多くの時間を費やさないことをお勧めします。新しい開発を行う場合は、ベストプラクティスに従ってください(上記の2つの推奨事項など)。既存のソフトウェアでは、頭痛の原因となっているものだけを修正します。

今、あなたはすでにその頭痛を抱えているように見えます。したがって、最初に、これらの主キーをID列(推奨)またはデフォルトのnewsequentialid()になるuniqueidentifier列に移行します。

ただし、ダウンタイムが取れない場合、これは難しい変更です。その場合は、まず、現在最も強い頭痛をサポートするために新しいインデックスを追加することから始めます(読み取り:ストアドプロシージャ)。その後、混乱を片付ける作業よりも。

4
Sebastian Meine

UNIQUEIDENTIFERを使用すると、VARCHARよりもはるかに少ないスペースを使用します。これは、UNIQUEIDENTIFERは16バイトのみを使用するのに対し、VARCHARを使用すると最低36バイトが使用されるためです。あなたの状況に基づいて、はい、パフォーマンスが向上し、インデックスキーの信頼性が向上します。 SQL Servers UNIQUEIDENFIERを使用する場合、複製のオプションはありません。これをデフォルト値で使用する場合、常に値が存在します。

2
Renegrin

時間がある場合:

  1. 各テーブルにnull許容の整数列を追加します。
  2. Row_Number()を使用して、Integer列の値を設定します(テーブルのcreate-timestampで順序付け)。
  3. 戻って、Integer列をnull不可に設定し、Identifyフィールドにします。
  4. このInteger列をクラスター化インデックスにします(既に存在する場合は、最初に古いクラスター化インデックスを非クラスター化インデックスにします)。
  5. このテーブルが外部キーとして参照されるすべての場所で、null許容の整数列を追加し、主キーテーブルの値に基づいて値を設定します。

ここで、もう少しエルボーグリースを塗る必要があります。
これらのレガシーテーブルにデータを保持する既存のロジックをすべて書き換えたくない場合:

  1. 追加したID列は自動的に設定されるため、整数で置き換えた外部キーがテーブルで参照されていない限り、既存の挿入/更新ステートメントをさらに修正する必要はありません。
  2. この主キーテーブルが外部キーとして参照されている他のテーブルの場合は、そこにあるクレイジーxxx-guid-varcharに基づいて外部整数キーを生成するトリガーを追加するだけで済みます。
  3. これにより、これらのテーブルに追加した外部整数キーが正しく入力されることが保証されます。これらのレガシーテーブルを挿入/更新する既存のコードを変更する必要はありません。

これで、問題のクエリを書き直して、新しい整数フィールドで結合することで、「最大のパフォーマンスの問題に対処する」ことができます。

幸運を!

0
MikeTeeVee