SQL Serverデータベース(2005および2008)であるレガシーデータベースがあります。
テーブル内のすべての主キーはUniqueIdentifiersです。
現在、テーブルにはクラスター化インデックスが作成されておらず、75万レコードしかないテーブルでパフォーマンスの問題が発生しています。これは私が唯一の主キーとして一意の識別子を使用して作業した最初のデータベースであり、SQLサーバーがデータを返すのにこれほど遅いのを見たことがありません。
一意の識別子にクラスター化されたインデックスを作成したくないのは、それらがシーケンシャルではないため、データの挿入に関してアプリの速度が低下するためです。
リモートサイトレコードのID管理の目的で使用されているため、uniqueidentifierを削除することはできません。
テーブルに大きな整数のID列を追加し、この列にクラスター化インデックスを作成し、一意のID列を含めることを考えていました。
すなわち
intidentity-挿入速度を維持する最初の列一意の識別子-アプリケーションが期待どおりに動作し続けることを保証します。
目標は、IDクエリと結合テーブルクエリのパフォーマンスを向上させることです。
Q1:これにより、データベースのクエリパフォーマンスが向上しますか、それとも遅くなりますか?
Q2:私がリストしていないこれに代わるものはありますか?
ありがとうピート
編集: パフォーマンスの問題は、特に「トランザクション/変更」テーブルのいくつかが一緒に結合されている場合、selectステートメントを介してデータをすばやく取得することです。
編集2:テーブル間の結合は、通常、すべて主キーと外部キーの間です。外部キーを持つテーブルの場合、よりカバーするインデックスを提供するために、非クラスター化インデックスに含まれます。
すべてのテーブルには、適切なクラスター化インデックスを提供する他の値はありません。
高負荷の各テーブルにID列を追加し、クラスター化インデックス内に現在のGuid PK列を含めて、最高のクエリパフォーマンスを提供することに傾倒しています。
編集3:クエリの80%は、データアクセスメカニズムを介して主キーと外部キーのみで実行されると推定します。通常、データモデルには、アクセス時にクエリを実行する遅延読み込みオブジェクトがあります。これらのクエリは、オブジェクトIDとPK列を使用します。タイプXの基準に基づくフィルターとして外部キー列を使用する、ユーザー主導のデータ除外/包含クエリが大量にあり、次のIDを除外します。残りの20%は、列挙型(int)列または日付範囲列のwhere句であり、システムで実行されるテキストベースのクエリはごくわずかです。
可能であれば、最も重いクエリをカバーするためにカバーインデックスをすでに追加しましたが、それでもパフォーマンスには失望しています。bluefootedが言うように、データはヒープとして保存されています。