Sql server 提高“foreign_key=x”查询的数据库性能

Sql server 提高“foreign_key=x”查询的数据库性能,sql-server,performance,sql-server-2008,foreign-keys,sql-server-express,Sql Server,Performance,Sql Server 2008,Foreign Keys,Sql Server Express,我在ms sql server express 2008中有一个数据库,可以从同一台pc使用linq to sql访问该数据库。 不是很多并发访问,而是复杂的查询 它有几个表,每个表都可能变得相当大,以至于查询、删除、更新和插入的性能变得太慢 有一个主表项目,几乎所有其他表都有 与项目的直接1-n关系 或与与项目具有1-n关系的表的1-n关系, 或与这些表之一的1-n关系,依此类推。 选择、删除、更新和插入始终在单个项目上操作。 我从不需要在不同的项目中更新条目,也不需要从2个项目中选择匹配的项

我在ms sql server express 2008中有一个数据库,可以从同一台pc使用linq to sql访问该数据库。 不是很多并发访问,而是复杂的查询

它有几个表,每个表都可能变得相当大,以至于查询、删除、更新和插入的性能变得太慢

有一个主表项目,几乎所有其他表都有

与项目的直接1-n关系 或与与项目具有1-n关系的表的1-n关系, 或与这些表之一的1-n关系,依此类推。 选择、删除、更新和插入始终在单个项目上操作。 我从不需要在不同的项目中更新条目,也不需要从2个项目中选择匹配的项目等

有什么方法可以利用这个事实来提高数据库的性能吗

我已经在外键项目ID上建立了一个非聚集索引(如果适用)

还有什么我能做的吗? 如果分区可用于sql express,它会帮助我吗

编辑:

解释为慢速查询的示例,大多数是linq到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 projectd=XY,在那里的某个地方

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

CREATE NONCLUSTERED INDEX <MeaningfulIndexName>
ON Items (ProjectID)
INCLUDE (Prop1, Prop2, Prop3)
最后一个SELECT查询也是如此。优化器应该意识到这个索引将产生一个更好的计划并使用它-检查查询计划,如果没有,则查看索引提示。您还可以删除ORs,只需执行三个单独的删除查询


在最后两个例子中,确保使用ORDERBY子句,以便查询知道您想要什么样的TOP。中间的一个很难:如果没有关于所有内容的索引,请检查查询计划,您可能想看看是否可以避免加入该名称字段,并尝试使用ID。我知道这并不总是可能的,但是SQL在比较数字方面比字符串要好。

我在数据库中使用索引或各种设置的所有尝试都没有显著提高性能

以下是最终对我有效的方法:

对于此类型的查询:

 delete from items 
 where items.projectID=X 
 AND (items.prop1=a OR items.prop2=b OR items.prop3=c)
与批量删除所有符合条件的项目不同,我发现了一种方法,即使用ON DELETE CASCADE,大大加快了tht的速度

创建一个新的虚拟项目 更新所有应删除的项目: 更新项目集项目。projectID=DummyProjectID 其中items.projectID=X 和items.prop1=a或items.prop2=b或items.prop3=c 删除虚拟项目。由于启用了级联删除,因此也删除了项目。 出于某种原因,这比简单地删除项目要快得多。创建新项目和更新1000个项目几乎是即时发生的,删除项目的速度至少是直接删除项目速度的10倍

对于这些类型的查询:

 select top 1 itemprops ...

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

你能给出一个慢查询的例子,以及相关的模式吗?你有运行维护作业吗?re:query 2-连接中的列上有索引吗?WHERE子句中的列是什么?查询3-使用SELECT*在表中有多少字段是错误的做法-只选择需要的字段-表是否规范化?另外,请记住,任何索引只有在@Jim McKeon时才有用,主键都有索引。我想外键也都有索引,但我得检查一下。关于select*,因为我使用linq to sql,所以我只是粗略地解释了我所做的查询类型,但是foo只包含5列。@mouters:没有维护作业,我应该运行一些吗?给定项目的数据大多保持静态,一次只能有一个项目处于活动编辑状态。我没有使用分区,但有人告诉我它只对非常大的表有用,比如1M+行。一篇关于它的优秀文章。