Tsql SQL查询在DBCC DBReindex或Alter Index之后运行缓慢或停滞

Tsql SQL查询在DBCC DBReindex或Alter Index之后运行缓慢或停滞,tsql,optimization,jdbc,Tsql,Optimization,Jdbc,全部, SQL 2005 sp3,数据库大小约为70gb。有时,当我在所有表中重新索引所有索引时,前端似乎会冻结或运行非常缓慢。这些查询来自前端,而不是sql server中的存储过程。前端使用JTDS JDBC连接来访问SQL Server。如果我们停止并重新启动发送查询的web服务,问题似乎就会消失。据我所知,我们有一个连接池,在其中我们重复使用连接,而不是每次都建立新的连接 并非每次重新编制索引时都会发生此问题。我已经用dbcc dbreindex和alter index online=o

全部,

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

并非每次重新编制索引时都会发生此问题。我已经用dbcc dbreindex和alter index online=on和sort in tempdb=on尝试了两种方法

了解为什么偶尔会发生此问题以及如何预防此问题将非常有帮助

提前感谢,


Gary Abbott

下次发生这种情况时,查看是什么阻止了来自客户端的请求。阻塞会话id将指示谁正在阻塞,而等待类型和等待资源将指示正在阻塞的内容。您也可以使用,以达到相同的效果

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


如果数据库不是预增长的,则索引重建的额外分配将触发数据库增长事件,如果将默认值保留为10%增量且未启用,则会非常缓慢。在数据库增长事件期间,该数据库中的所有活动都被冻结,这可能是您的问题,即使索引是联机重建的。同样,Activity Monitor和sys.dm_exec_请求都会清楚地显示这一情况。

下次发生这种情况时,请查看是什么阻止了来自客户端的请求。阻塞会话id将指示谁正在阻塞,而等待类型和等待资源将指示正在阻塞的内容。您也可以使用,以达到相同的效果

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


如果数据库不是预增长的,则索引重建的额外分配将触发数据库增长事件,如果将默认值保留为10%增量且未启用,则会非常缓慢。在数据库增长事件期间,该数据库中的所有活动都被冻结,这可能是您的问题,即使索引是联机重建的。同样,Activity Monitor和sys.dm_exec_请求都会清楚地显示这一情况。

我确实查看了阻塞,这些查询没有被阻塞,它们处于挂起状态。我是一个非常积极主动的数据库架构师,我有足够的空间来重新索引数据和日志文件。现在这里有一个无趣的转折,我听说他们有5个线程打开只有4个被冻结,一个线程仍在工作。我相信,当线程在使用JDBC连接重建索引期间仍然处于活动状态时,在删除索引时或重建索引后,它可能无法识别查询计划。有没有办法更好地处理这些JDBC连接?Suspended仍然会在wait_type中显示挂起原因,并在sys.dm_exec_请求中显示wait_资源。它们是什么?关于查询计划:当索引重建开始时,它将提升索引的元数据版本,这将使所有现有计划无效。必须重新编译新查询并生成新计划(因为新计划必须同时更新旧索引和在线索引)。但所有这些都是由服务器处理的,客户端没有理由阻止。我没有查看等待类型,下次我会查看。我怀疑现有的JDBC连接正在进行表扫描,这将导致性能低下。有没有更好的方法来处理现有的JDBC连接?即使在线执行alter index,也会使查询计划无效?感谢您的见解。我可以诚实地说,我以前从未遇到过这个问题,但我确信我们使用Microsoft驱动程序的Microsoft商店已经爆满。这就是为什么我认为它可能与JDBC驱动程序有关。如前所述,如果我让他们停止并重新启动他们的Web服务,所有的东西都会在重启后飞走。在执行过程中,无效的查询计划不会发生。如果客户机正在执行扫描,则它执行的计划对表的元数据具有Sch-S锁,并且该锁阻止ALTER INDEX继续进行。为了启动联机索引操作,ALTER必须插入Sch-M锁(模式修改),该锁保证表中没有其他线程执行任何活动。当下一个客户端查询登陆时,它将发现表已经修改,并将得到一个新的计划。我确实查看了阻塞,这些查询没有被阻塞,它们处于挂起状态。我是一个非常积极主动的数据库架构师,我有足够的空间来重新索引数据和日志文件。现在这里有一个无趣的转折,我听说他们有5个线程打开只有4个被冻结,一个线程仍在工作。我相信,当线程在使用JDBC连接重建索引期间仍然处于活动状态时,在删除索引时或重建索引后,它可能无法识别查询计划。有没有办法更好地处理这些JDBC连接?Suspended仍然会在wait_type中显示挂起原因,并在sys.dm_exec_请求中显示wait_资源。它们是什么?关于查询计划:当索引重建开始时,它将提升索引的元数据版本,这将使所有现有计划无效。必须重新编译新查询