使用Linq To实体和存储过程锁定(或缓慢)数据库

时间:2011-03-03 11:09:57

标签: sql-server performance stored-procedures linq-to-entities

我正在使用Linq To Entities(L2E)来映射我的数据库中的所有存储过程,以便轻松转换为对象。我的数据不是很敏感(所以我在考虑隔离级别“READ UNCOMMITED”到处都是)。我有几个表有数百万行。我有网站和一堆脚本利用使用实体框架创建的相同数据模型。我已经索引了所有表(每个表最多3个),因此我使用的每个过滤器都直接被索引捕获。我的脚本主要由

组成

1)从数据库中获取(~5秒) 2)制作API(1-3秒) 3)在数据库中添加结果

我将READ_COMMITTED_SNAPSHOT和ALLOW_SNAPSHOT_ISOLATION设置为ON。

使用此策略,我的查询大多数都是固定的,并且非常快(通常)。我的脚本仍然使用了一些查询,这些查询最多可以运行20秒,但通常不会调用它们。

问题是突然整个数据库变慢,我的所有查询都会慢慢返回(可能超过10秒)。使用Sql Profiler我试图找到问题。

如上所述,我正在考虑NOLOCKS使用“READ UNCOMMITED”...现在我正在浏览每个可能的数据库调用并添加索引和/或缓存表以使调用更快。

我还考虑过删除L2E并访问“旧方式”以确保不是问题。我的数据上下文是否在查看我的表?它确实看起来那样。我已经尝试通过API调用来生成上下文以最小化创建的上下文,但是现在我为每个调用创建了一个新的上下文,因为我认为它正在查找数据库。

问题在于我无法控制,每一次通话都是快速的,因为所有的永恒,否则整个系统都会变慢。

当我重新启动sql server并重新建立索引时,它会在一切都变得缓慢之前的一段时间内非常快。任何指针将不胜感激。

1 个答案:

答案 0 :(得分:0)

您是否考虑过检查服务器上是否有重大等待。

查看sys.dm_os_wait_stats (Transact-SQL)上的以下页面,了解您是否可以深入了解服务器运行缓慢的原因....