ODBC 性能 Access 2010 和 SQL Server 2008 R2

Posted

技术标签:

【中文标题】ODBC 性能 Access 2010 和 SQL Server 2008 R2【英文标题】:ODBC-Performance Access 2010 and SQL Server 2008 R2 【发布时间】:2017-01-06 08:19:32 【问题描述】:

我有一个 Access 2010 应用程序。访问只是前端。后端是 SQL-Server 2008。之间的连接是 ODBC。 ODBC 驱动程序是“SQL Server”(版本 6.01.7601.17514)。

I Access 是一个包含超过 500.000 行的表。每行有 58 列。所以性能非常非常慢,在大多数情况下。无法搜索一列,Access 处于冻结状态。

我知道,这不是一个新问题...

现在我的问题:

司机还好吗?因为,当我创建本地 ODBC-Connection(Windows 8)时,我还可以选择驱动程序“SQL Server”。但这里是版本 6.03.9600.17415。

速度有区别吗?我有一种感觉,当我在Win8下使用新版驱动的Acc local时,它比Terminal Server和旧版驱动要快。

Win8下本地我也可以选择驱动“SQL Server Native Client 10.0”(版本2009.100.1600.01)。那些“Win8-ODBC-Drivers”有什么区别?您会使用哪个驱动程序,为什么?

较新的 SQL Server 有什么用?例如 2014 与 2008。使用 ODBC 时,2014 是否比 2008 快?

服务器硬件是什么?当我使用 SSD 而不是 HDD 时?让 SSD 的 ODBC-Connection 更快?

所有用户都在终端服务器上工作。主要使用 Office 2010,但也使用 proAlpha(ERP 系统)。并且还具有访问权限。现在一位用户告诉我,有时,如果 TS 上的用户不多,Access 会快得多。你什么意思?使用一个 TS 并对其进行处理时,只能使用 Access,而不是其他应用程序。那么 ODBC 更快吗?

我还能尝试什么?

非常感谢。

【问题讨论】:

您可以尝试/做很多事情,但最终唯一能给您带来显着性能提升的事情是将尽可能多的处理从前端移到后端视图、存储过程和函数的使用。在生成访问报告或通过链接到原始表并有权访问执行所有联接、位置和组并在 SQL Server 视图上执行所有操作并直接链接到该视图时,性能存在天壤之别。我已经完成了需要 3 分钟的过程,并以这种方式使它们需要 15 秒。 【参考方案1】:

我注意到 SQL Server Native Client 10.0 在使用 SQL Server 2008 和 Access 2010 时比原来的 Native Client 有一些性能改进。

我会质疑为什么您需要搜索/加载表的所有 500,000 行。假设这是在一个表单中,这听起来有点像糟糕的表单设计。您的所有表单都应该只加载您感兴趣的记录,而不是默认加载所有记录。事实上,在您知道用户在寻找什么之前,在表单加载时不加载任何记录被认为是相当好的做法。

58 列听起来也有点过分——这些列中是否包含 memo (varchar(Max)) 字段?这些可能应该被移动到一个单独的表中。检查你的数据结构,看看你是否正确地对其进行了规范化。

您的字段是否正确编入索引?如果您在它们上搜索,索引将大大提高性能。

在 sql server 上创建仅返回合适的记录子集的视图,然后可以将其链接为 Access 中的表,还可以提高性能。

【讨论】:

【参考方案2】:

具有 500,000 行的表很小 - 即使对于 Access。您所做的任何搜索都应该在不到 1 秒的时间内给出结果!

解决这个问题的最佳方法是在公交车站问一位 90 岁的女士以下问题:

当您使用即时取款机时,下载每个帐户然后询问用户帐号是否有意义?即使是公交车站的 90 岁老太太也会告诉你,最好询问帐号然后下载 1 条记录!

当您使用 Google 时,您不会下载整个互联网然后询问用户要搜索什么。或者你创建一个巨大的网页然后你说使用 ctrl+f 来搜索那个巨大的浏览器页面。

因此,请考虑一下所有软件的工作原理。该软件不会在本地下载和准备所有数据,然后询问您要查找的内容。你反其道而行之!

所以这里的简单解决方案是在您开始从服务器提取数据之前询问用户。构建一个如下所示的表单:

然后,为了匹配搜索(比如 LastName),您可以在 文本框更新后。

Dim strSQL     As String

strSQL = "select * from tblCustomers where LastName like '" & Me.txtLastName & "*'"

Me.RecordSource = strSQL

这样,表单只会提取您需要的数据——即使有 1000 万行,这种方法也会在您的计算机上即时运行。上面使用了“*”,因此只需要输入 LastName 的前几个字符。结果是一种“选择”的形式,然后您可以通过单击上面的“眼镜”按钮来跳转或编辑一条记录。只需启动 + 打开一个详细信息表单。代码是:

docmd.OpenForm "frmCustomer",,,"id = " & me!id

让我们再回答几个问题:

速度有区别吗? (ODBC 驱动程序)

不,驱动程序的性能确实没有差异 - 它们的性能都差不多,用户可能永远不会看到或注意到使用不同驱动程序时的性能差异。

例如 2014 与 2008。使用 ODBC 时,2014 是否比 2008 快?

通常不会。我的意思是想一想您对计算机的任何经验(除非您是计算机新手?)。每次升级到新的 Word 或新的会计程序时,该程序都会变得更大、加载时间更长、使用更多内存、使用更多磁盘空间,并且几乎总是使用更多处理。因此,鉴于过去 30 年的台式计算机,几乎在所有情况下,下一个较新版本的软件都需要更多的内存、更多的磁盘、更多的处理,因此运行速度比该软件的先前版本慢(我愿意是你的知识和经验 - 因此较新的版本往往不会运行得更快 - 在计算机历史上存在一些“罕见”的例外情况,但任何软件的较新版本往往需要更多的计算机资源,而不是更少。

现在一位用户告诉我,有时,如果 TS 上的用户不多,Access 会快得多。什么意思?

以上与 ODBC 驱动无关。在上述上下文中,当您使用终端服务器时,数据库应用程序和前端 (Access) 都在同一台计算机/服务器上运行。这意味着从服务器到应用程序的数据传输速度非常快,并且不是以网络速度发生的,而是以计算机速度发生的(因为数据库和应用程序都在同一台服务器上运行)。您可以在每台计算机上安装 Access,然后让 Access 通过网络将数据从服务器拉到客户端工作站——这很慢,因为有网络。使用 TS,应用程序和服务器运行速度非常快,中间没有网络。应用程序和服务器的海量处理和速度可以协同工作——一旦提取数据并渲染屏幕,则只有屏幕数据通过网络线路传输。因此,结果比在每个工作站上运行 Access 快得多。

有时,如果 TS 上的用户不多,

正确,由于用户应用程序正在服务器上运行,因此应用程序和 SQL 服务器之间不存在网络。但是,由于每个用户都在服务器上运行他们的应用程序(而不是每个工作站计算机),因此服务器上需要更多的负载和资源。如果许多用户正在使用该服务器,那么该服务器现在的工作量很大,因为该服务器必须运行 SQL Server 并为该服务器上运行的每个 Access 副本分配内存和处理。

传统设置意味着 Access 在每台计算机上运行。因此,运行 Access 的内存和 CPU 发生在每个工作站上——服务器不必为 Access 提供 CPU 和内存,服务器只运行 SQL 服务器并为来自每个工作站的数据请求提供便利。但是,由于网络比在一台计算机上处​​理数据要慢得多,因此您的瓶颈不是在处理,而是非常有限的网络速度。由于 Access 和 SQL 以及所有处理都发生在服务器上,因此更容易使该服务器的资源和容量过载。但是,网络速度通常是计算机设置中最慢的链接。由于所有处理和数据处理都发生在服务器端,因此只有 RESULTING 屏幕和显示通过网络线路发送。如果计算机软件必须处理 100 万行数据,然后显示一个总结果,那么只有 1 个总结果从显示的网络线路上下来。如果您在每个工作站上本地运行 Access 并处理 100 万行,则必须有 100 万行数据通过网络管道(但是,您可以修改您的 Access 设计以使 SQL 服务器在数据通过网络之前首先处理数据管道来避免这个问题。但是使用 TS,因为 Access 没有在您的计算机上运行,​​所以您不必担心网络流量 – 但您仍然必须担心 Access 从 SQL 服务器获取多少数据 – 因此上述关于仅加载的提示您需要的数据到表单中。因此,不要将大量数据集加载到 Access 表单中,而只需在开始从 SQL 服务器中提取数据之前询问用户。

【讨论】:

以上是关于ODBC 性能 Access 2010 和 SQL Server 2008 R2的主要内容,如果未能解决你的问题,请参考以下文章

ODBC:用于 MS Access 的 SQL Server 2008 驱动程序

在 MS Access 2007 中对 ODBC 表导入 sql 查询

使用 ODBC + Access 时转义 SQL 查询中的输入数据

在 Python ODBC 中使用 Microsoft Access SQL 运算符

在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异

与 Oracle SQL Developer 的 MS Access ODBC 连接