为什么"SELECT 1 from <table>"会导致另一个进程执行删除LCK_M_IX



我有一个表列出了patient_clinic_visits。我有SQLServer2005后端。Access2010前端。

每天早上,这张表都需要从医院大型机的数据转储中刷新。

这个数据转储包括前一天的信息(谁参加了,没有参加,取消了(和未来6周的预约。

因此,我做了一个";从Patient_clinic_visits删除*,其中Visit_Date>(一天(和<(一天+1(依次清理每天的表格,然后在经过一些处理后上传新数据。

在大多数日子里,每天只有大约100-150条记录。它们是Master_Patient_Table中Pat_ID的一个外键,该表上有NO_ACTION链

目前,在处理了几天的数据后,这个Delete查询在Access前端超时(即周一、周二、周三正常工作…(

我运行sp_whoisative并获取:

00 01:53:01.926 52[[query SELECT 1 FROM"dbo"."Patient_Clinic_Visits"]]RAHCC_User(265ms(ASYNC_NETWORK_IO 0 0 NULL 51 0 2 suspended 0 NULL SAH0020663 RAHCC_DB Microsoft MDB RAHCC 2013-04-0209:08:33.027 0 2013-04-02 11:01:35.033

00 00:00:27.610 53[[query--从Patient_Clinic_Visits删除Clinic_date>='2013年3月26日'AND clinic_date<'2013年3月27日'AND Clinical_location='MONC']]HAD\jhogan05(27596ms(LCK_M_IX 16 0 0 52 1074 0 130已挂起2 NULL SAH0048645 RAHCC_DB Microsoft SQL Server Management Studio Express-查询2013-04-02 11:01:07.343 0 2013-04-02 13:01:35.033

这表示我的客户端前端正在等待一个";从Patient_ Clinic_;这阻碍了这个过程。显然,这是由于客户端上的ASYNC_NETWORK_IO(Access前端处理表请求,然后不处理数据时可能会发生这种情况(。

a( 然而;从Patient_ Clinic_ Visits中选择1";真的应该只返回TRUE还是FALSE??这不太可能填满任何东西,也不清楚为什么会导致阻塞情况??

b( 我找不到";选择1…";在我的Access前端的任何位置。。这可能是SQLSERVER为响应更复杂的选择而进行的子选择序列的一部分吗?如果是,我如何在流程历史中找到导致这种情况的真正选择?

欢呼,

JonHD

a(查询"SELECT 1 from Patient_Clinic_Visits"将返回一个空的结果集(如果Patient_CClinic_Visites表为空(或一个与Patient_Colic_Visits表具有相同行数的结果集,每行都有一个1。为此,SQL Server必须针对整个Patient_Plinic_VVisits表发出查询,这(假设默认锁定行为(将导致共享(读取(锁定成为针对该表中的行的问题。

b( (注意:OP在评论中谈到了这一点(我可能遗漏了一些内容,但我看不出您在哪里提出了基于sp_whosactive的"SELECT 1 from Patient_Clinic_Vists"查询。了解从应用程序发送到数据库服务器的SQL的最佳方法可能是将SQL Profiler与适当的筛选器一起使用(可能只筛选来自运行应用程序的主机的连接(。

相关内容

最新更新