2

我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。Access 应用程序将继续与转换为链接表的本地表一起使用。

一个连续的表格在加载时会挂起 15 - 30 秒。它显示大约 2000 条记录。当我查看 SQL Server Profiler 以查看它在做什么时,它正在为表单中的每条记录单独调用后端数据库。因此,表单打开时的延迟是由对数据库的 2000 多次单独调用引起的。

这是非常低效的。有没有办法让 Access 一次调用后端数据库并一次检索所有记录?

我不知道这是否相关,但表单的记录源是 SQL Server 后端数据库中的一个视图,该视图通过 Access 链接表链接到(因此,希望 Access 只是将其视为表,而不是看法)。我需要在 SQL Server 中的视图上使用而不是触发器,并在 Access 中的链接表上使用唯一索引,以允许通过表单更新记录。

4

4 回答 4

2

如果打开该连续表单的行为确实生成了大约 2000 个单独的 SQL 查询(视图中的每一行一个),那么这对于 Access 与 SQL Server 链接的“表”交互是不寻常的行为。在正常情况下发生的情况是:

  • Access 提交单个查询以返回表/视图中所有行的所有主键值。该查询可以基于表单的FilterOrder By属性由其他列过滤和/或排序。这为 Access 提供了可能在表单中显示的每一行的键值列表,按它们出现的顺序排列。

  • 然后,Access 创建一条 SQL 准备语句,sp_prepexec用于一次从表/视图中检索十 (10) 行的整行。第一个电话看起来像这样......

    declare @p1 int
    set @p1=4
    exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "ID","AgentName" FROM "dbo"."myTbl" WHERE "ID" = @P1 OR "ID" = @P2 OR "ID" = @P3 OR "ID" = @P4 OR "ID" = @P5 OR "ID" = @P6 OR "ID" = @P7 OR "ID" = @P8 OR "ID" = @P9 OR "ID" = @P10',358,359,360,361,362,363,364,365,366,367
    select @p1

    ...并且每个后续调用都使用sp_execute, 像这样

    exec sp_execute 4,368,369,370,371,372,373,374,375,376,377

  • Access 会重复这些调用,直到它检索到足够的行来填充连续表单的当前页面。然后它会立即显示这些表格。

  • 显示表单后,Access 将“预取”更多批次的行(每行 10 行),以预期用户点击PgDn或开始向下滚动。

  • 如果用户单击记录导航器中的“最后一条记录”按钮,Access 将再次使用sp_prepexecsp_execute请求足够的 10 行批次来填充表单的最后一页,并可能在用户决定时预取另外几个批次点击PgUp或开始向上滚动。

因此,在您的情况下,如果 Access 确实导致 SQL Server 为视图中的每一行运行单独的查询,那么您的 SQL 视图可能有一些特殊的原因导致它。您可以通过将 Access 链接表创建到单个 SQL 表或简单的单表 SQL 视图来进行测试,然后使用 SQL Server Profiler 检查打开该链接表是否会导致相同的行为。

于 2013-05-06T19:16:32.280 回答
2

原来问题是两个聚合字段。一个字段的控制源是 =Count(ID),另一个字段的控制源是 =Sum(Total_Qty)。

清除这两个字段的控制源可以让表单快速打开。SQL Server Profiler 显示它调用 sp_execute,正如 Gord Thompson 所描述的那样,一次检索七批 10 行。比进行 2000 次调用以一次检索一行要快得多。

于 2013-05-07T09:09:47.387 回答
1

我又遇到了同样的问题,但这次是不同的原因。为了完整起见,我将其包括在此处,以帮助处于类似情况的任何人:

这次底层查询挂起,SQL Server Profiler 显示与以前相同的行为,Access 对 SQL Server 数据库进行单独调用,以便为查询中的每条记录一次带回一条记录。

原因原来是查询中的 ORDER BY 子句。我猜 Access 必须先从 SQL Server 拉回链接表中的所有记录,然后才能对它们进行排序。当我想到它时是有道理的。虽然我不知道为什么 Access 不只是一次提取所有记录,而不是一次获取一个记录。

于 2013-06-04T00:24:01.453 回答
0

我会尝试将其设置Recordset Type快照(在Data表单属性表的选项卡和/或您用于表单源的查询的属性表上)

于 2013-05-05T15:52:08.703 回答