1

我想知道是否有人对我有任何建议,基本上我们正在使用文本框进行搜索,但这会导致一些问题。我们有一个列表框,其行源设置为相当于 select * from tblSearch where searchField Like " " & [Forms]![frmNames]![txtSearch].[Text] & " "

此查询将 Max Rows 设置为 25,并且所有表都是链接到 SQL Server 的表。在搜索文本框的 On Change 事件中,它在列表框上运行重新查询,一切似乎都像疯了一样,除了数据库每天都在为用户挂起,这让我发疯了!

基本上研究了这一点,我将其归结为 Access 正在将 select 语句发送到 SQL(在同一台服务器上),但没有等待每个查询完成并在继续之前对其进行处理。因此,在 Access 从服务器返回响应之前,用户键入下一个字符并触发对 SQL 的新查询。在 SQL Server 中,您会发现资源等待“ASYNC_NETWORK_IO”的挂起查询,我理解这是客户端不使用来自 SQL Server 的数据。

我必须做的是将用于重新查询的事件从 On Change 更改为 afterupdate,这确实会影响具有排序或“Google Instant”搜索体验的整个用户体验,因为他们必须在看到之前键入并按 Enter结果,不好看!

所以这就是问题所在,只是想知道是否有人有任何建议,我现在已经没有想法了!

4

1 回答 1

1

这里的想法是保持查询结果精简和平均。 每次在 Access 中运行此查询时,即使不是数千次(如果不是数千次,也可能是数百次OnChange),您希望尽可能少地通过管道。您可以执行许多优化以使 SQL 查询及其结果更快:

  1. 更改SELECT * FROM ...SELECT [column1],[column2],[etc] FROM ...(其中的列仅是 ListBox 所需的那些列。即使您要查询的表只有您需要的列,这仍然是最佳实践,因为当您再次查看 3-12 个月时会很清楚稍后,它使数据库引擎(在 Access 或 SQL 中)不必查找表中的列。
  2. searchField确保您在 SQL Server 数据库中的列上有一个索引。
  3. 将查询移动到 SQL Server 中的视图并将其放在SELECT TOP 25...那里。即使您将 MAX ROWS 25 放在 Access 中,它仍然可以拉更多(即 ALL)然后过滤到 25。此外,通过将其放在视图中,您可以将其放在WITH (NOLOCK)表的末尾(名称/别名)给出SQL Server 提示它不需要为此查询锁定表上的任何内容。这会加快速度,尤其是在有多个用户频繁重新查询的情况下。

还有其他事情取决于您的具体情况,但这些肯定会减少您的挂起时间。

于 2013-05-06T17:28:42.707 回答