使用On Change事件进行搜索时,Microsoft Access与SQL Server链接表挂起

时间:2013-03-27 07:59:01

标签: sql-server ms-access ms-access-2010

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

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

基本上研究了这个问题,我将其归结为Access将select语句发送到SQL(在同一服务器上),而不是等待每个查询完成并在继续之前处理它。因此,在Access从服务器获取响应之前,用户键入下一个字符,并向SQL发出新查询。在SQL Server中,您可以找到资源等待“ASYNC_NETWORK_IO”的挂起查询,据我所知,客户端不会使用SQL Server中的数据。

我必须做的是将用于重新查询的事件从On Change更改为afterupdate,这实际上取消了具有排序或“Google Instant”搜索体验的整体用户体验,因为他们必须键入并命中在看到结果之前输入,不是很好!

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

1 个答案:

答案 0 :(得分:1)

这里的想法是保持查询结果的精简和平均。每次此查询在Access中运行时,如果不是数千次,则很容易成百上千(OnChange个事件并且超过1个用户),您希望尽可能少地通过管道。您可以执行许多优化以使SQL查询及其结果更快:

  1. SELECT * FROM ...更改为SELECT [column1],[column2],[etc] FROM ...(其中列只是ListBox所需的列。即使您查询的表只有您需要的列,这仍然是最佳实践很明显,当你在3-12个月后再次查看它时,它会保存db引擎(在Access或SQL中),不必查找表中的列。
  2. 确保SQL Server数据库中的searchField列有索引。
  3. 将查询移至SQL Server中的视图,并将SELECT TOP 25...放在那里。即使你把MAX ROWS 25放在Access中,它仍然可以拉更多(即ALL),然后过滤到25.另外,通过将它放在视图中,你可以将WITH (NOLOCK)放在表的末尾( name / alias)给SQL Server提示它不需要为此查询锁定表上的任何内容。如果有多个用户经常重新查询,这会加快速度。
  4. 根据您的具体情况还有其他一些事情,但这些肯定会减少您的停机时间。