0

我在 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在某个地方

4

2 回答 2

0

对于第一条语句 (delete),您可以创建一个新的非聚集索引,其中包括两个连接字段:

CREATE NONCLUSTERED INDEX <MeaningfulIndexName>
ON Items (ProjectID)
INCLUDE (Prop1, Prop2, Prop3)

最后一个 SELECT 查询也是如此。优化器应该意识到这个索引会产生更好的计划并使用它 - 检查查询计划,如果没有,请查看索引提示。您也可以删除 OR 并只执行三个单独的删除查询。

在最后两个中,确保使用 ORDER BY 子句,以便查询知道您想要什么 TOP。中间一个是困难的:缺少对所有内容的索引(再次检查查询计划),您可能想看看是否可以避免加入该“名称”字段并尝试使用 ID。我知道这并不总是可能的,但 SQL 更擅长比较数字而不是字符串。

于 2012-04-28T00:09:29.147 回答
0

我对数据库中索引或各种设置的所有尝试都没有显着提高性能。

这最终对我有用:


对于这种类型的查询:

 delete from items 
 where items.projectID=X 
 AND (items.prop1=a OR items.prop2=b OR items.prop3=c)

我没有批量删除符合条件的所有项目,而是找到了一种明显更快的方法,使用ON DELETE CASCADE

  1. 创建一个新的虚拟项目
  2. 更新所有应该删除的项目: update items set items.projectID=DummyProjectID where items.projectID=X AND (items.prop1=a OR items.prop2=b OR items.prop3=c)
  3. 删除虚拟项目。由于启用了级联删除,这也删除了项目。

由于某种原因,这比简单地删除项目要快得多。创建新项目和更新几 1000 个项目几乎是立即发生的,删除项目比直接删除项目至少快 10 倍。


对于这些类型的查询:

 select top 1 itemprops ...

一次将项目的所有 itemprops 加载到字典中,然后回答来自该本地缓存的所有查询,速度要快得多。它不是很优雅,我必须记住在每次更改后更新缓存,但它确实有效。

于 2012-05-26T20:49:18.053 回答