我们正在尝试使用 SQL Azure 作为我们的 Microsoft Access 后端。但是,我们在代码中或作为查询运行简单查询时遇到了巨大的性能问题。当从本地 SQL Management Studio 查询窗口直接针对 SQL Azure 数据库运行相同的查询时,它执行得很好。
注意:相同的查询对本地 SQL 数据库执行良好。
- 微软访问 2013
- ODBC SQL 本机 11.0
- 道
- 表已链接(不是 Web 应用程序)
任何机构都有任何想法或关于性能问题。
我将访问用作红砖数据仓库的前端。我们的情况可能有一些相似之处。我的观察是,如果 redbrick 表具有多列主键,则查询需要很长时间。事实上,我什至能够看到会发生什么。
我看到的和这个差不多。假设我的 redbrick 表,我们称之为 MyTable,有一个 5 列的主键。其中之一称为 TheDate。我在访问中构建了一个基本上类似于以下内容的查询:
select somefields
from MyTable
where field1 = [prompt for value]
and TheDate > 7 days ago, whatever that syntax is in access.
如果我提交的值导致不返回任何记录,则它是即时的。但是,即使只返回一条记录,我也看到这种 sql 在 redbrick 中运行。
select somefields
from MyTable
where (field1 = something
and TheDate = something
and field 3 = something
and field4 = something)
or (same sort of thing for a different date)
and so on for all 7 days in the date range.
我不是特别在意,因为我是用户,我认为结果值得等待。事实上,有时我在等待时会查看 StackOverflow。
另一方面,直通查询就像直接查询数据库一样。此外,对具有单键主键的表的查询很快。
这可能就是发生在你身上的事情。或者它可能是别的东西。
如果我理解正确,您是从 Azure 上的远程 SQL Server 实例链接表并在 MS Access 前端运行查询?
如果是这种情况,有很多事情会影响性能:
Access 会尽可能尝试在服务器上运行查询,但如果您以需要 Access 从服务器提取原始表数据以在本地执行查询本身的方式编写查询,则情况并非总是如此。
例如,如果您的查询中有 UDF(VBA 中的用户定义函数),或者如果您使用只有 Access 有的函数,而不是 SQL Server,就会发生这种情况。
在您的查询中,如果您将本地表与远程表混合使用,请小心,您最终会传输大量数据,如果 MSAccess 无法优化查询,则可能传输整个表。
如果您在 SQL Server 中的每个表上都没有 ROWVERSION 字段,则 MSAccess 将需要读取比确定特定行是否已更改所需的更多数据(如果需要读取所有字段以进行比较它们到它的缓存)。
如果您的索引不适合您运行的查询类型,那么您最终可能会获得比必要更多的数据。
您可以尝试缓解问题
确保您的查询没有提取超出您实际需要的数据。
使用 SQL Server 的探查器工具来准确了解正在执行的内容以及 Access 请求的数据量。
使用传递查询。它们将完全在服务器上运行。
在 SQL Server 上定义将返回所需数据的视图,然后将这些视图链接为前端中的表。
定义可以仅计算和返回所需数据的存储过程。
避免将远程数据绑定到包含太多控件的表单。
参考