同じPCからlinq-to-sqlを使用してアクセスするms-sql-server express 2008のデータベースがあります。 (同時アクセスはほとんどありませんが、複雑なクエリ)'foreign_key = x'クエリのデータベースパフォーマンスを向上させる
複数のテーブルがあり、クエリ、削除、更新、挿入のパフォーマンスが非常に遅くなるまで、各テーブルは非常に大きくなる可能性があります。
つのメインテーブルプロジェクトとほぼすべての他のテーブルが
- プロジェクト
- 又は1-持つテーブルと1-nの関係に直接1-nの関係有しありプロジェクトとのN関係、
- 、またはこれらのテーブルのいずれかとの1-n関係などがあります。
選択、削除、更新、および挿入は、常に1つのプロジェクトで動作します。 異なるプロジェクト間でエントリを更新したり、2つのプロジェクトなどから一致するアイテムを選択する必要はありません。
データベースのパフォーマンスを向上させるためにこの事実を使用する方法はありますか?
適用可能な場合は、外部キーproject_IDに対して既に非クラスタ化インデックスがあります。
他に何かできますか? sql-expressで使用可能だった場合は、パーティション化が役に立ちますか?
編集:遅いクエリの
例(iは直接SQLを実行するいくつかの削除のために言い換え、最もありLINQツー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
を持っています
スロークエリーの1つと関連するスキーマの例を挙げることはできますか? – mwigdahl
メンテナンスジョブを実行していますか? –
re:query 2 - ジョインの列にインデックスがありますか? WHERE句の列はどうでしょうか?クエリ3 - テーブルにいくつのフィールドがあるか(SELECT *を使うのは悪い習慣です - 必要なものだけを選択します) - テーブルは正規化されていますか?また、それが[選択](http://www.akadia.com/services/ora_index_selectivity.html)の場合にのみ有用なインデックスであることを覚えておいてください。 –