PKとしてGUIDを使用するいくつかのデータベースを継承しました。すべてのデータ型がuniqueidentifierである代わりに、ほとんどはvarchar(50)と一部のvarchar(100)です。フィールドはtrueですGUID一部の作成者
myID = 'xxx' + convert(varchar(40)、newID())
一般的にそれは少し混乱しています
この設計のパフォーマンスへの影響は何ですか。また、データ型を変換するためにテーブルを再作成する価値があります。テーブルは通常、約1/2 Mのレコードで、2〜4Mのレコード範囲に2つのテーブルがあります。
この質問の原動力は、24個のテーブルとビューを結合するプロシージャを最適化しようと(失敗)しており、サーバーがそれをうまく処理していないことです。
洞察をありがとう
一般に、クラスター化されたインデックスキーを長くすることはお勧めできません。そのため、キーがいくつかの短い列またはいくつかの長い列で構成されているかどうかは重要ではありません。これにより、すべてのインデックスのメンテナンスと、そのテーブルのすべてのインデックスの読み取りアクセスが、コストが非常に高くなります。 PKはデフォルトでクラスター化インデックスによって適用されるため、非常に長いクラスター化インデックスキーを持っている可能性があります。
また、一般に、クラスター化されたインデックスキーを単調に増加させることをお勧めします。 NEWIDに基づいて列が評価されるため、新しい行がテーブル全体に分散され、断片化が発生します。余分な長いキーは、これをさらに悪化させます。
そして最後に、一般に、事前にパフォーマンスをチューニングするのに多くの時間を費やさないことをお勧めします。新しい開発を行う場合は、ベストプラクティスに従ってください(上記の2つの推奨事項など)。既存のソフトウェアでは、頭痛の原因となっているものだけを修正します。
今、あなたはすでにその頭痛を抱えているように見えます。したがって、最初に、これらの主キーをID列(推奨)またはデフォルトのnewsequentialid()になるuniqueidentifier列に移行します。
ただし、ダウンタイムが取れない場合、これは難しい変更です。その場合は、まず、現在最も強い頭痛をサポートするために新しいインデックスを追加することから始めます(読み取り:ストアドプロシージャ)。その後、混乱を片付ける作業よりも。
UNIQUEIDENTIFERを使用すると、VARCHARよりもはるかに少ないスペースを使用します。これは、UNIQUEIDENTIFERは16バイトのみを使用するのに対し、VARCHARを使用すると最低36バイトが使用されるためです。あなたの状況に基づいて、はい、パフォーマンスが向上し、インデックスキーの信頼性が向上します。 SQL Servers UNIQUEIDENFIERを使用する場合、複製のオプションはありません。これをデフォルト値で使用する場合、常に値が存在します。
時間がある場合:
ここで、もう少しエルボーグリースを塗る必要があります。
これらのレガシーテーブルにデータを保持する既存のロジックをすべて書き換えたくない場合:
これで、問題のクエリを書き直して、新しい整数フィールドで結合することで、「最大のパフォーマンスの問題に対処する」ことができます。
幸運を!