我在 ms-sql-server express 2008 中有一个数据库,可以从同一台 PC 使用 linq-to-sql 访问该数据库。(并发访问不多,但查询复杂)
它有几个表,每个表都可以变得很大,以至于查询、删除、更新和插入的性能变得太慢。
有一个主表项目,几乎所有其他表都有
- 与项目的直接 1-n 关系
- 或与与项目具有 1-n 关系的表的 1-n 关系,
- 或与这些表之一的 1-n 关系,依此类推。
选择、删除、更新和插入始终在单个项目上操作。我从不需要跨不同项目更新条目或从 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
在某个地方