我想知道是否有人对我有任何建议,基本上我们使用文本框进行搜索,但这会导致一些问题。我们有一个列表框,其行数设置为相当于 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”搜索体验的整体用户体验,因为他们必须键入并命中在看到结果之前输入,不是很好!
所以这就是问题,只是想知道是否有人有任何建议,我现在已经没有想法了!
答案 0 :(得分:1)
这里的想法是保持查询结果的精简和平均。每次此查询在Access中运行时,如果不是数千次,则很容易成百上千(OnChange
个事件并且超过1个用户),您希望尽可能少地通过管道。您可以执行许多优化以使SQL查询及其结果更快:
SELECT * FROM ...
更改为SELECT [column1],[column2],[etc] FROM ...
(其中列只是ListBox所需的列。即使您查询的表只有您需要的列,这仍然是最佳实践很明显,当你在3-12个月后再次查看它时,它会保存db引擎(在Access或SQL中),不必查找表中的列。searchField
列有索引。SELECT TOP 25...
放在那里。即使你把MAX ROWS 25放在Access中,它仍然可以拉更多(即ALL),然后过滤到25.另外,通过将它放在视图中,你可以将WITH (NOLOCK)
放在表的末尾( name / alias)给SQL Server提示它不需要为此查询锁定表上的任何内容。如果有多个用户经常重新查询,这会加快速度。根据您的具体情况还有其他一些事情,但这些肯定会减少您的停机时间。