うーん、デフォルトでクラスター化されることを忘れたときに、そのMiniProfilers
テーブルがどのように作成されたかに大きな間違いを犯したようprimary key
です...そしてクラスター化インデックスはGUID列であり、非常に大きな違いです。
データはクラスター化インデックスと同じ順序でディスクに物理的に格納されるため(実際、テーブルはクラスター化インデックスであると言えます)、SQLServerは新しく挿入されたすべての行をその物理的な順序で保持する必要があります。これは、本質的に乱数を使用している場合、ソートを維持するための悪夢になります。
修正は、他のすべてのテーブルと同じように、自動増加intを追加し、主キーをそれに切り替えることです(なぜこれを見落としたのか、覚えていません...ここでStackOverflowでこのストレージプロバイダーを使用していませんまたは、この問題はずっと前に発見されていたでしょう)。
テーブル作成スクリプトを更新し、現在のテーブルを少しで移行するための何かを提供します。
編集
これをもう一度見てみると、メインMiniProfilers
テーブルは単なるヒープである可能性があります。つまり、クラスター化されたインデックスはありません。行へのすべてのアクセスはそのGUIDID
列によるため、物理的な順序付けは役に立ちません。
MiniProfiler sqlテーブルを再作成したくない場合は、次のスクリプトを使用して、主キーを非クラスター化できます。
-- first remove the clustered index from the primary key
declare @clusteredIndex varchar(50);
select @clusteredIndex = name
from sys.indexes
where type_desc = 'CLUSTERED'
and object_name(object_id) = 'MiniProfilers';
exec ('alter table MiniProfilers drop constraint ' + @clusteredIndex);
-- and then make it non-clustered
alter table MiniProfilers add constraint
PK_MiniProfilers primary key nonclustered (Id);
別の編集
了解しました。作成スクリプトを更新し、ほとんどのクエリのインデックスを追加しました。GitHubのコードをご覧ください。
既存のテーブルをすべて削除して、更新されたスクリプトを再実行することを強くお勧めします。