SQL查询运行缓慢或DBCC DBReindex或Alter索引后卡住

问题描述:

全部,SQL查询运行缓慢或DBCC DBReindex或Alter索引后卡住

SQL 2005 sp3,数据库大小约70gb。偶尔,当我重新索引我所有表格中的所有索引时,前端似乎会冻结或运行速度非常缓慢。这些是来自前端的查询,而不是sql server中的存储过程。前端使用JTDS JDBC连接来访问SQL Server。如果我们停止并重新启动发送查询的Web服务,问题似乎就消失了。我的理解是,我们有一个连接池,在该连接池中,我们重新使用连接,并且不会每次建立新的连接。

每次我们重新编制索引时,都不会发生这个问题。我用dbcc dbreindex和alter index online = on尝试了两种方法,并在tempdb = on中进行排序。

任何有关此问题发生的原因以及如何防止此问题的任何洞察将是非常有用的。

由于提前,

加里雅培

当发生这种情况下一次,看看sys.dm_exec_requests看到什么阻止来自客户端的请求。 blocking_session_id将指示谁阻塞,并且wait_type和wait_resource将指示阻塞的内容。您也可以使用Activity Monitor达到相同的效果。

在预先生成的数据库上,联机索引重建不会阻止正常的活动9选择/插入/更新/删除)。由于在线索引重建,服务器上的负载可能会增加,这可能会导致整体响应速度变慢,但不应导致阻塞。

如果数据库未预先增长,索引重建的额外分配将触发数据库增长事件,如果以10%的增量保留默认值并且未启用instant file initialisation,则该事件可能非常缓慢。在数据库增长事件期间,所有活动都会冻结在该数据库中,即使索引是在线重建的,这也可能是您的问题。同样,活动监视器和sys.dm_exec_requests都会清楚地表明这种情况正在发生。

+0

我看过阻塞,这些查询没有被阻止,它们处于挂起状态。我是一个非常积极主动的数据库架构师,我有足够的空间来重新编制数据和日志文件。现在这里是一个令人无法接受的转折,我被告知他们有5个线程打开,只有4个被冻结,一个线程仍在工作。 我相信,当使用JDBC连接进行索引重建期间线程仍处于活动状态时,它可能无法在删除索引或重建索引之后识别查询计划。有没有办法更好地处理这些JDBC连接? – DanceswithLightning 2010-02-09 19:18:07

+0

Suspended仍然会在sys.dm_exec_requests中的wait_type和wait_resource中显示挂起原因。他们是什么?关于查询计划:当索引重建开始时,它会提升索引的元数据版本,这将使所有现有计划失效。新的查询必须重新编译并生成一个新计划(因为新计划必须更新旧索引和在线的在建工程)。但所有这些都是由服务器处理的,客户端没有理由阻止。 – 2010-02-09 19:31:24

+0

我没有看待等待类型,下次我会。我怀疑现有的JDBC连接正在进行表扫描,这将导致性能下降。有没有更好的方法来处理现有的JDBC连接?即使在线修改索引时,也会使查询计划失效?感谢您的洞察力。 – DanceswithLightning 2010-02-09 20:11:41