1

我有一张列出 Patient_clinic_visits 的表格。我有 SQLSERVER 2005 后端。Access2010 前端。

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

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

因此,我在 Patient_clinic_visits where Visit_Date > (a day) and < (a day + 1) 中执行“DELETE *”,以便在经过一些处理后上传新数据之前依次清理每天的表格。

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

目前,在处理了几天的数据后,此 Delete 查询在 Access 前端超时(即周一、周二、周三......)

我运行 sp_whoisactive 并得到:

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

00 00:00:27.610 53 [[查询 -- 从 Patient_Clinic_Visits 中删除诊所日期 >= '26-Mar-2013' AND Clinic_date < '27-Mar-2013' AND Clinic_location = 'MONC' ]] HAD\jhogan05 (27596ms) LCK_M_IX 16 0 0 52 1,074 0 0 130 暂停 ​​2 NULL SAH0048645 RAHCC_DB Microsoft SQL Server Management Studio Express - 查询 2013-04-02 11:01:07.343 0 2013-04-02 11:01:35.033

这表明我的客户端前端正在等待“来自 Patient_Clinic_Vists 的 SELECT 1”,这会阻止该过程。显然这是由于客户端上的 ASYNC_NETWORK_IO (这可能发生在 Access 前端执行表请求然后不处理数据时)。

a)但是“从 Patient_Clinic_Visits 中选择 1”实际上应该只返回 TRUE 或 FALSE ?这不太可能填满任何东西,并且不清楚为什么会导致阻塞情况?

b) 我在 Access 前端的任何地方都找不到“SELECT 1 ...”。这可能是 SQLSERVER 为响应更复杂的选择而做出的一系列子选择的一部分吗?如果是这样,我如何在该进程历史记录中找到导致这种情况的真正选择?

干杯,

乔恩高清


a) 查询“从 Patient_Clinic_Visits 中选择 1”将返回空结果集(如果 Patient_Clinic_Visits 表为空)或包含与 Patient_Clinic_Visits 表一样多的行的结果集,每行中都有一个 1。为此,SQL Server 必须针对整个 Patient_Clinic_Visits 表发出查询,这(假设默认锁定行为)将导致共享(读取)锁成为针对该表中的行的问题。

b) (注意:OP 在评论中提到了这一点)我可能遗漏了一些东西,但我看不出你在哪里提出了基于 sp_whosactive 的“从 Patient_Clinic_Vists 中选择 1”查询。了解从应用程序发送到数据库服务器的 SQL 的最佳方式可能是使用带有适当过滤器的 SQL Profiler(可能仅过滤来自运行应用程序的主机的连接)。

4

1 回答 1

1

a) 查询“从 Patient_Clinic_Visits 中选择 1”将返回空结果集(如果 Patient_Clinic_Visits 表为空)或包含与 Patient_Clinic_Visits 表一样多的行的结果集,每行中都有一个 1。为此,SQL Server 必须针对整个 Patient_Clinic_Visits 表发出查询,这(假设默认锁定行为)将导致共享(读取)锁成为针对该表中的行的问题。

b) (注意:OP 在评论中提到了这一点)我可能遗漏了一些东西,但我看不出你在哪里提出了基于 sp_whosactive 的“从 Patient_Clinic_Vists 中选择 1”查询。了解从应用程序发送到数据库服务器的 SQL 的最佳方式可能是使用带有适当过滤器的 SQL Profiler(可能仅过滤来自运行应用程序的主机的连接)。

于 2013-04-02T03:12:51.947 回答