我有一个位于对等网络上的Access 2000数据库。 (所有计算机都通过以太网100连接到一个简单的4端口交换机) 该数据库设计有后端和前端。 有2个用户通过网络连接到后端。一个用户直接连接到后端,因为后端位于她的计算机上。 所有的计算机都是相当低的规格,有500 meg或1 gig的ram
我有一个表单frmInvoice,它基于表“tblInvoice”表中有大约60,000条记录。还有表“tblInvoiceProducts”链接到“tblInvoice”。表“tblInvoiceProducts”中有大约150,000条记录。
当我在托管后端的计算机上打开“frmInvoice”表单时,表单会很快打开。但是,如果我在其他计算机上打开表单,则打开速度非常慢。但是,一旦打开,记录导航就会很快。
我认为问题是当表单打开时,Access会打开整个表格,并且可以访问所有记录。我在这个假设中是否正确?
我需要纠正这个问题并欢迎所有建议。
我将安装D-Link DNS-323 2-Bay网络存储机柜并将后端数据库存储在此,因为这将提高安全性/数据保护。
提前致谢
答案 0 :(得分:6)
“我认为问题在于,当表单打开时,Access会打开整个表格并且所有记录都可以访问。我在这个假设中是否正确?”
我的赌注是你绝对正确。
如果您打开表单的属性表,请选择“数据”选项卡,然后查看“记录源”的值,是否看到其中一个表的名称?
或者没有WHERE子句的查询,也许就像“SELECT * FROM tblInvoice;”?
如果您对其中任何一个问题的回答都是肯定的,那么Access必须通过网络从表中提取每条记录。
所以,不要那样做! :-)性能良好的关键是将表单的记录源限制为合理的行子集。
选择一些在您的情况下有意义的标准,可能是发票日期,并构建一个将该标准合并到其WHERE子句中的查询。将该条件基于索引字段 - 如果您的表在该字段上还没有索引,则添加索引。您可以通过在查询设计器中创建新查询来进行实验......也许SQL View看起来像这样:
SELECT Invoice_ID, Customer_ID, invoice_date
FROM tblInvoice
WHERE invoice_date = Date();
这将仅检索invoice_date与今天的日期匹配的行。
(如果您已经加载了表单,将所有行拉到本地缓存中,您将无法获得该查询速度的真实指示。最好从新的Access会话测试查询没有先装入表格。)
然后给用户一个方法来选择不同的invoice_date。例如,一个名为txtSelectDate的文本框控件。在该控件的After Update事件中,您可以编写一个更新的SELECT语句,您将其应用为表单的记录源。
Private Sub txtSelectDate_AfterUpdate()
Dim strSql As String
If Len(Me.txtSelectDate & "") > 0 Then
strSql = "SELECT Invoice_ID, Customer_ID, invoice_date" & vbCrLf & _
"FROM tblInvoice" & vbCrLf & _
"WHERE invoice_date = " & Format(Me.txtSelectDate, "\#yyyy-m-d\#")
Debug.Print strSql
Me.RecordSource = strSql
End If
End Sub
Debug.Print行将在立即窗口中打印SELECT语句,因此如果出现任何问题,您可以查看已完成的语句,并复制&将其粘贴到新查询的SQL视图中进行测试。更改Record Source属性会自动导致Access重新查询数据源。您可以在文本框的“更新前”事件中验证用户的条目,以确保它是有效日期。
另一种可能性是首先使用单个不可编辑的虚拟记录(1)加载表单。然后仅在用户选择invoice_date后显示记录。要做到这一点,你可以使用这样的东西作为表格的记录来源:
SELECT TOP 1 Null AS Invoice_ID, Null AS Customer_ID, Null AS invoice_date
FROM tblInvoice;
答案 1 :(得分:2)
除了HansUp提出的出色建议外,我还要补充以下内容:
详细表格的加载时间不应超过几秒钟。如果他们这样做,你要么做错了,要么你需要优化你的绑定/代码 数据表和报告可能需要更长的时间,具体取决于它们的复杂程度以及人们需基本上,如果它需要很多东西,它需要快速。另一方面,如果是月度报告,则可以接受等待30秒。
您没有说明您的前端是否从后端拆分,或者您是否正在为数据和UI使用相同的.mdb。如果您这样做,请停止并split your database,即使是与数据在同一台计算机上的人 您的后端mdb文件应该只包含您的数据表,而不包含任何其他内容。必须在用户的各台计算机上安装前端mdb。
确保您的表具有适合您的过滤器和排序条件的索引。如果您将表单绑定到tblInvoice并将属性设置为按发票引用排序,并且您的表没有此索引,则Jet将需要从表中加载所有发票引用以检查其顺序。
如果所有索引都正常,Access将不加载所有数据以详细形式显示单个记录。如果您使用数据表或连续表格,它只会加载大量数据 所以这个问题可能与其他东西有关:也许你正在从你的表单中绑定一个复杂的查询,比如一个组合框或数据表,这就是拖延你的特定事情。
尝试逐个绑定/取消绑定控件以查看哪个具有最大影响,然后专注于优化该特定区域。
您还可以根据需要从代码中绑定控件。例如,您可以保持表单或昂贵的控件未绑定,并等待用户在将其绑定到表单/控件之前选择所需的记录。
如果您在表单上有大量信息来加载来自其他查询和表格的相关数据,您可以重新设计表单以在选项卡控件中对数据进行分组,然后在每个选项卡中都有一个子表单 - 控件显示数据并加载此选项只有用户选择选项卡。
确保如果在连续表单/数据表中显示大量数据,则将它们绑定为快照以使其成为只读。如果它们是可读/写的并且其他人正在尝试加载详细的表单,则Access必须进行大量的锁定检查以确保不在多个位置编辑数据。您将数据设置为只读越多越好。
提高性能的最后一个提示:在后端创建一个带有DUMMY字段的虚拟表,从前端链接到它。将此表绑定到具有DUMMY字段的单个控件的表单。使此表单不可见,并在启动应用程序时自动将其打开
此表单将保持虚拟表打开,并确保您的前端无需在每次需要查询时打开/关闭与后端的连接。
锁定数据库的时间非常昂贵,尤其是在网络上。如果经常这样做,它确实会降低性能
也许它不会改变你的具体情况,但我发现这是一个很好的做法,因为影响可能是巨大的。
答案 2 :(得分:1)
我发现表单加载速度很慢的原因。 他们包括: 1.在表单上有活动过滤器 2.具有允许用户导航/选择记录的组合框
如果我删除这些,我就不会遇到并加速问题。
要允许用户导航/选择记录,我在表单上有一个cmd按钮。单击时,它会打开一个弹出窗体,允许用户选择所选的记录。我将记录id存储为变量,关闭弹出窗体并过滤表单的记录集,例如 select * from tblInvoice,其中InvoiceId = tmpInvoiceId
适合我!
答案 3 :(得分:-5)
是Access(Jet)在整个网络中糟透了......为了使事情变得更复杂,Access中没有真正的“索引工具”,就像在SQL Server中一样..
如果我是你,我会去购买一台固态PC,在其上安装SQL Server 2008 R2,然后升级到Access Data Projects。