【问题标题】:How to speed up Access front-end / SQL Server back-end with large tables?如何使用大表加速 Access 前端/SQL Server 后端?
【发布时间】:2014-07-20 00:07:56
【问题描述】:

我正在为 Access 中的 SQL Server 重新设计一个前端,以允许我们公司的非程序员查询数据库。

问题是有些表非常大。目前我正在使用链接表。我试图允许的一个查询访问五个表,包括那个大表。该表有数百万行,因为它包含了公司中的每笔交易。

当我在 Access 中尝试查询时,它花费了几分钟并且无法完成,并且 Access 只是冻结了。因此,我决定在进行联接之前使用子查询来缩小大表的范围。表中的每个条目都有一个日期,所以我做了一个子查询并过滤它以仅返回当前日期以进行测试。事实上,因为我只是在测试,我什至进一步过滤它只返回日期列。这将其缩小到 80,000 个左右。最终我确实得到了结果,但花了大约三分钟,这只是我正在测试的子查询。一旦结果 DID 返回,每次我尝试使用滚动条时,Access 都会冻结。

接下来我尝试了直通查询,认为它会更快。它更快,但仍然需要大约一分半钟,并且滚动条仍然存在冻结问题。问题是这个查询在 SQL 服务器上只需要 3 秒(我的意思是日期查询)。我希望我能很快得到这个查询,然后将它用于连接。

我可以使用视图,但问题是我希望用户能够指定日期范围。

我能做些什么来加快这个性能还是我搞砸了?

【问题讨论】:

  • 可能不是查询很慢,更可能是在 UI 中呈现结果网格。您真的需要将那么多记录返回给用户吗?我怀疑很多人会滚动浏览 80000 条记录。我会限制查询,所以如果可行,它只返回前一百行。
  • 传递肯定是简短的答案...您能否发布表和键的图像 - 包括每个是本地的还是在 SQL Server 上,以及您尝试过的查询?
  • 您是否检查过日期是否有索引?它有很大的不同。
  • @Remou 我正在使用 SQL Server 数据库。嗯...至于索引,我实际上是附加到视图,而不是表本身(因为我需要将 ID 列从 long 转换为 varchar 以便 Access 导入它。) create_date 上没有索引的视图,但在原始表中有,当我在 SQL 服务器上查询视图时,它仍然只需要 3 秒。
  • 我想你已经找到了你的问题,如果你的查询不是 sargable,Access 会拉取所有的数据,而不仅仅是相关的行。我不明白为什么你对 long 有问题,我不明白。哪个版本的 Access?

标签: sql sql-server performance ms-access


【解决方案1】:

让用户滚动浏览成千上万条记录是没有意义的。他们将在数据洪流中丢失。相反,为他们提供分析数据的方法。首先回答这个问题:“用户需要什么样的信息?”他们可能想知道一天或一个小时内发生了多少特定类型的交易。他们可能想比较不同的日子。让用户分组数据;这减少了必须传输和显示的记录数量。向他们显示计数、总和或平均值。让他们过滤数据或在图表中显示分组数据。

【讨论】:

  • 这是一个很好的观点。但是,如果不慢,那会不会仍然很慢?除非你这么说(就像上面有人说的那样),不是查询很慢,而是显示?无论如何,目前我正在这样做,因为我正在替换一个这样做的程序,我想从复制它的功能开始。之后我可以期待改进它。但也许我应该将数据限制为 1000 行左右,就像上面有人说的那样。
  • 如果您对数据进行分组,例如按一刻钟为单位,那么您可以将必须​​从 DB 传输到 UI 并在网格中显示的记录数减少到每天 96 条记录 (当然你会在 SQL 中进行分组)。这为用户提供了更好的概览并且速度更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多