我遇到了SQL Azure数据库的奇怪行为。在调查为什么存储过程突然开始超时(经过几个月的正常工作而没有任何问题)后,我发现了以下行为(代码来自我的SQL Server mgmt工作室控制台,而不是来自存储过程,以及实际的表/字段名称替换,但它说明了问题)
我正在运行一个非常简单的查询
select * from dbo.mytable with (nolock) where field1 = 'somevalue'
查询只是挂起,状态栏中的指示器正在旋转,状态为“正在执行查询”,没有任何反应。作为一项实验,我让它执行了几个小时,什么都没发生。 SQL Azure监视器不显示任何死锁。
使用过滤器的任何其他字段的类似查询立即执行。但这是有趣的部分 - 如果我在sql mgmgt studio中打开另一个窗口并在相同的数据库上运行相同的查询,而第一个挂起 - 它立即执行而没有任何的问题。一旦我在第一个窗口中取消查询,如果我在第二个窗口中运行查询它会停止,并且它在并行窗口中运行的任何其他实例都可以正常运行。 到目前为止,这只发生在一个表中,并且仅在通过此特定字段进行过滤时才会发生。不幸的是,这是数据库中的主表。
当我查询sys.dm_exec_requests时,它显示查询wait_type为SE_REPL_SLOW_SECONDARY_THROTTLE,状态最初正在运行,但随后更改为已挂起。同时在其他窗口中查询正在运行,其wait_type为SOS_SCHEDULER_YIELD。但它正在运行,而第一个则不是。
一些背景信息:
SQL Azure实例,1GB,使用空间35MB,36个活动连接
mytable - 61K行,15列,30MB,在标识主键上具有聚簇索引,在日期字段上具有非聚集索引。
field1 是从varchar(16)null派生的用户定义数据类型,但字段本身定义为非null。
mytable中的其他字段具有相同的数据类型,也不是null,并且按它们过滤显示没有问题。
mytable包含应用程序的事务信息,并且具有高插入率。插入是在小事务中发生的,应该没有锁定问题。事务外部的所有读取都是使用nolock提示进行的。
不仅选择行为方式的查询,而且该表上涉及该特定字段的任何类型的查询。
我将尝试在其他服务器上创建此数据库,复制数据并查看问题是否仍然存在,但我感觉它存在于数据库实例中。
由于