私はマルチモジュールのC#/ SQL Serverベースのアプリケーションを設計しています。私の設計は、KeyTypeValues
と呼ばれるテーブル内のすべての汎用ルックアップ値を保持することです。この表は、どのタイプのデータであるかを定義するKeyTypes
に関連しています。例えばパフォーマンスの問題を引き起こす問題のデータベース設計
:
oms.KeyTypes
------------
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY
KeyTypeName VARCHAR(40) NOT NULL
...
oms.KeyTypeValues
-----------------
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY
KeyTypeId INT NOT NULL (FOREIGN KEY to oms.KeyTypes Id)
KeyTypeValueMeaning VARCHAR(80) NOT NULL
...
oms.KeyTypesサンプルデータ:
Id KeyTypeName KeyTypeDescription
-- ----------- ------------------
1 RES_MFGS Resource Manufacturers
2 RES_OWNERSHIP_TYPES Resource Ownership Types
...
oms.KeyTypeValuesサンプルデータ:
Id KeyTypeId KeyTypeValueMeaning
-- --------- -------------------
1 1 Ford
2 1 Chevrolet
3 2 Owned
4 2 Leased
...
だから、アイデアは私が持っていないということです別途Manufacturers
、OwnershipType
、Model
などのテーブルを作成するその値以外のこれらの値に関する追加の情報は実際には必要ありません。現在、私は約88を既に定義しており、デザインはうまく機能しています。
res.ResourceItems
というテーブルから参加する際にパフォーマンスの問題を引き起こす問題のクエリに取り組んでいます。私はそれをKeyTypeValues
テーブルに6回ずつ異なるルックアップに参加させなければなりません。 ResourceItems
定義の
パート:
res.ResourceItems
-----------------
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY
OwnsershipTypeId INT NOT NULL
ManufacturerId INT NOT NULL
...
私は私の問題キータイプ(RES_OWNERSHIP_TYPES
)を除去した場合、私は大きく開く、それを実行することができ、それは約17秒で70の以上の列に〜112,000行を引き戻します。パフォーマンスは素晴らしいことではありませんが、私は9つの追加テーブルに参加しなければならないと考えています。ただし、結合を追加してRES_OWNERSHIP_TYPES
を取得すると、実行時間は45秒にジャンプします。 RES_OWNERSHIP_TYPES
キータイプはこの時点で3つの可能な値しか持たず、oms.KeyTypeValues
には合計レコードが約3,000しかありません。それは、構築されているシステムにもっと多くを追加するにつれ、時間の経過とともにゆっくりと成長し続けます。
オーナーシップタイプを引き出し、代わりにを作成すると、オーナーシップタイプが存在しない可能性があるため、これを処理するより効率的な方法です。しかし、私はそのような劇的なパフォーマンスヒットがある全体的なデザインに懸念しています。
すべてのID値に対して、res.ResourceItems
からoms.KeyTypeValues
までの外部キーの関係があります。 oms.KeyTypeValues.Id
列にNon-Unique、Non-Clusteredインデックス設定もあります。私は断片化を解消するためにそれらを再構築しました。
res
スキーマ内の別の
KeyTypes
と
KeyTypeValues
テーブルを作成しただけで
RES_OWNERSHIP_TYPES
値をロードし、それに結合され、そして実行時間は約17秒に戻りました。私はむしろ、私の目的を打ち負かしたり、より大きな問題にバンドエイドを入れているように見えるので、これを実行してはいけません。
私はなぜそのような大きなヒットがあるのかを判断できず、誰かが私が見落としているかもしれないことについての洞察を得ることを望んでいたと思います。必要に応じて、より多くのデータベース設計を分かち合うことができます。
[カバーインデックス](http://www.dbadiaries.com/sql-server-covering-index-and-key-lookup/)の使用を検討してください。 SQL Server 2005以降のバージョンでは、[included columns](http://msdn.microsoft.com/en-us/library/ms190806.aspx)と複合インデックスがサポートされています。 – HABO