同じPCからlinq-to-sqlでアクセスされるms-sql-server express 2008にデータベースがあります。(同時アクセスは少ないが、複雑なクエリ)
複数のテーブルがあり、各テーブルが非常に大きくなり、クエリ、削除、更新、および挿入のパフォーマンスが非常に遅くなる可能性があります。
1 つのメイン テーブルプロジェクトがあり、他のほぼすべてのテーブルにプロジェクトがあります。
- プロジェクトとの直接的な 1 対 n の関係
- または、プロジェクトと 1 対 n の関係を持つテーブルとの 1 対 n の関係、
- または、これらのテーブルの 1 つとの 1 対 n の関係などです。
選択、削除、更新、および挿入は、常に 1 つのプロジェクトに対して実行されます。異なるプロジェクト間でエントリを更新したり、2 つのプロジェクトから一致するアイテムを選択したりする必要はありません。
この事実を利用してデータベースのパフォーマンスを向上させる方法はありますか?
該当する場合は、外部キー project_ID に対する非クラスター化インデックスが既にあります。
他にできることはありますか?sql-express でパーティショニングが利用できる場合、パーティショニングは役に立ちますか?
編集:
遅いクエリの例 (言い換えると、ほとんどは linq-to-sql クエリです。いくつかの削除については、SQL を直接実行します):
delete from items
where items.projectID=X
AND (items.prop1=a OR items.prop2=b OR items.prop3=c)
(deletes a few 1000 items, fast when database is empty, slow when lots of other projects exist)
select top 1 itemprops
from itemprops
inner join items on items.id = itemprops.itemid
inner join project on item.projectid=project.id
inner join modes on itemprops.modeId = mode.id
where item.name = X and project.id = Y and mode.name = z
(find a certain itemprop corresponding to an item and a mode)
select top 1 * from foo where projectID=x and name=Y and type=z
(nonclustered index on projectID + name + type exists)
私のすべてのクエリの共通点は次のとおりですwhere projectID=XY
。