有关在 Access 数据库中的查询性能的信息

文章翻译 文章翻译
文章编号: 209126 - 查看本文应用于的产品
中等: 要求基本的宏、 编码,和互操作技能。

本文只适用于 Microsoft Access 数据库 (.mdb)。

为这篇文章的一个 Access 97 版本,请参阅 112112
展开全部 | 关闭全部

本文内容

简介

本文讨论如何优化在 Microsoft Access 2000 中,在 Microsoft Access 2002,并在 Microsoft Office Access 2003 中的查询性能。包括以下主题:
  • 查询优化器为 Microsoft Jet 数据库引擎的
  • 查询计时
  • 分析性能
  • 若要提高查询性能的提示
本文假定您的数据库具有本地表而不是链接或附加表。如果链接表,则此信息将仍然适用。但是,有其他问题会影响查询包含链接表的性能。有关使用链接表提高性能的详细信息为您可以通过使用下列字符串搜索 Microsoft 知识库:
odbc 和优化和表

更多信息

查询优化器为 Microsoft Jet 数据库引擎的

Jet 数据库引擎包含几个的组件,但查询最重要的组件 (和最复杂) 是优化程序。优化器是基于成本的。这意味着优化程序将时间成本分配给每个查询任务,然后选择生成预期的结果集的成本最低的执行的任务列表。所任务花费时间执行该任务就是越昂贵。

若要决定使用何种查询策略,优化程序使用的统计信息。一些因素的这些统计信息基于以下因素:
  • 在表中的记录数
  • 在表中的数据页的数目
  • 表的位置
  • 索引是否存在
  • 如何唯一索引是
优化程序然后根据这些统计信息,选择特定的查询处理的最内部的查询策略。

每次编译查询时,会更新统计信息。查询被标记为编译时查询 (或其基础表) 和压缩数据库时保存的任何更改。如果查询标记为编译中,在编译和更新的统计信息将会发生下一次运行查询。编译通常采用从第二个一到四秒。

如果您的数据库中添加大量的记录,您必须打开并保存您的查询重新编译查询。例如对于如果设计,并使用一小部分示例数据,然后测试查询您必须重新查询编译后被添加到数据库中的其他记录。执行此操作时您希望确保在使用您的应用程序时,实现最佳查询性能。

注意您不能查看 Jet 数据库引擎优化方案,并且您不能指定如何优化查询。但是,可以使用数据库文档管理器确定索引是否存在以及如何唯一索引。

有关在 Access 2000 中使用数据库文档管理器时,可能会发生此问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
207782ACC2000: 错误使用数据库文档管理器如果对象处于打开状态

查询计时

有两个大量的时间度量,选择查询:
  • 若要显示数据的第一个屏幕的时间
  • 获取最后一条记录的时间
如果查询返回的数据只能有一个屏幕,这些两个时间度量值都是相同。如果查询返回多个记录,这些时间度量值可以是很大的不同。

如果两个测量值相同时在数据表视图中查看选择查询,您将看到一个屏幕的数据和该查询为"1 的记录 N 返回的记录的总数。如果它是更快地显示数据是以完成查询,然后检索最后一条记录的第一个屏幕,Jet 数据库引擎,您将看到的数据,但在 N 的记录 1"没有 N 屏幕。N 值为空,直到查询完毕或直到您滚动到最后一条记录。

此行为是选择两个性能策略之一,Jet 数据库引擎的结果:
  • 完成查询,然后显示数据
  • 显示数据,然后完成查询
您不能控制使用该策略。Jet 数据库引擎选择最有效的策略。

分析性能

如果您使用 Microsoft Access 7.0、 Access 97、 Access 2000、 Access 2002 或 Access 2003,您可以使用性能分析器分析数据库中的查询。由于查询性能分析紧密 Jet 数据库引擎,性能分析器建议仅当该索引将实际上由 Jet 数据库引擎优化查询时,才添加索引。这意味着性能分析器可以提供性能更特定于您的数据库比下方"以提高查询性能的提示"一节中列出的一般建议的提示。

若要访问 7.0 中、 在 Access 97 中,在 Access 2000 中,在 Access 2002 中或在 Access 2003 中,请运行性能分析器,请按照下列步骤操作:

工具 菜单上单击 分析,然后单击 性能

若要提高查询性能的提示

若要提高查询性能,请尝试下列提示:
  • 压缩数据库

    当您压缩数据库可以加快查询。当压缩数据库时,表的记录被重新组织,以便记录驻留在相邻数据库页中按照表的主键进行排序。这提高了表中的记录的顺序的扫描的性能,因为只有最小数量的数据库页现在具有读取检索所需的记录。压缩数据库后,运行每个查询,以编译该查询,使每个查询将现在具有更新过的表统计信息。
  • 索引字段

    索引用于设置查询字段和索引字段的条件联接的两面上的任何字段。或创建这些字段间的关系。当您创建具有实施参照完整性的关系时,Jet 数据库引擎索引上创建外键如果尚不存在。否则,Jet 数据库引擎将使用现有的索引。

    注意Jet 数据库引擎会自动优化如果联接在您的硬盘上的 Access 表和 ODBC 服务器表的查询访问表是小和 $ 如果联接的字段编制索引。在这种情况下 Access 将提高性能,方法是从服务器请求所需的记录。 请确保您加入不同来源的表的联接字段编制索引。
  • 选择适当的在最小数据类型

    当您在表中定义的字段时, 选择了适合字段中数据的最小数据类型。同时,确保 (如果 字段大小 属性设置为 长整型) 您计划在联接中使用的字段可具有相同的数据类型或者如自动编号、 数字的兼容的数据类型。
  • 您必须将字段添加

    当您创建一个查询,必须将字段添加。在用于设置条件的字段,单击以清除 显示 复选框,如果要显示这些字段。
  • 将 SQL 语句另存为查询

    如果为窗体或报表的 记录来源 属性设置为一个 SQL 语句,将 SQL 语句另存为查询,然后将 记录来源 属性设置为查询的名称。
  • 避免使用计算的字段

    避免在子查询中的使用计算的字段。如果添加了一个查询包含到另一个查询的计算的字段,则计算字段中的表达式可能会影响最上层查询的性能。在下面的示例查询 Q1 用作输入查询 Q2 的:
    Q1: SELECT IIF([MyColumn]="Yes","Order Confirmed","Order Not Confirmed") AS X FROM MyTable ;
    第 2 季度: SELECT * FROM Q1 WHERE X ="订单已确认";
    因为在 Q1 中的 IIF 表达式不能优化,所以 Q2 也不能优化。如果不能优化的表达式嵌套在子查询中,所有查询都不能优化。

    另一种构造查询的方法是,如下所示:
    Q1: SELECT * FROM MyTable WHERE MyColumn ="是";
    如果表达式需要在输出中,请试着将表达式放在窗体或报表上的控件中。例如对于您可以将前一个查询更改为参数查询提示输入 MyColumn 的值,然后使窗体或报表基于该查询。在窗体或报表上,您可以再添加一个计算的控件,具体取决于为在 $ MyColumn 中的值将显示"hello"或"再见。

    如下构造查询:
    参数 [若要查看已确认的订单,请输入是。若要查看未确认的订单,输入号]文本 ;
    选择 *
    FROM MyTable
    WHERE MyColumn = [若要查看已确认的订单,请输入是。若要查看未确认的订单,输入号] ;
    在计算控件在窗体或报表上,键入:
    = IIF([MyColumn]="Yes","Order Confirmed","Order Not Confirmed")
  • 指定分组依据

    通过在根据联接字段中值分组记录时, 相同的表进行合计 (进行聚合计算上) 域中的字段指定分组。例如对于在 Northwind.mdb 示例数据库中,如果您创建一个查询在订单明细表,然后根据订单 id,来分组中的数量字段进行总计,可以指定分组依据订单 id 字段在订单详细信息中的表。如果您指定分组订单 id 字段订单表中,访问必须首先联接的所有记录,然后执行将聚合的进行聚合,然后加入所需的字段而不是。

    为更高的速度使用分组少的字段上尽可能。 如果可以,或者,使用 第一个 函数。

    如果一个总计查询中包含联接考虑对在一个查询中的记录进行分组,然后将该查询添加到一个单独的查询执行联接的。执行此操作时可能会与某些查询提升性能。
  • 避免限制性的查询条件

    如果可以,请避免在计算字段和非索引字段上的限制性的查询条件。使用可优化的条件表达式。
  • 在表之间的联接中使用的字段中测试您的查询性能

    如果您使用条件来限制在一个字段中具有的一对多关系的表之间的联接中使用的值,测试是执行查询的速度会更快些以放置"一"端上或在"多"方的联接条件。在某些的查询中,您可能会发现更快的性能情况"一"侧的联接的"多"侧 (而不是联接字段中添加条件。
  • 索引的排序字段

    用于排序的字段编制索引。
  • 使用生成表查询来创建表

    如果您的数据很少更改,使用生成表查询通过查询结果来创建表。使用生成的表而不是查询作为基础的窗体、 您的报告或其他查询。请确保您在这篇文章中添加索引根据阅读的准则。
  • 避免使用域聚合函数

    避免使用域聚合函数如 DLookup 函数访问不是在查询中的表中的数据。 域聚合函数是特定于访问,这意味着,在 Jet 数据库引擎不能优化使用域聚合函数的查询。 而是,添加到在此函数正在访问的表的查询或创建一个子查询。
  • 使用固定的列标题

    如果创建的交叉表查询,使用尽可能的固定的列标题。
  • 使用运算符

    使用 between...and 运算符,In 运算符 = 索引的字段上的运算符。
  • 优化服务器上的性能

    进行大量更新查询对 ODBC 数据源,通过 FailOnError 属性设为是来优化服务器上的性能。

参考

有关优化性能,在 Microsoft Access 2000 中的详细信息的 帮助 菜单上单击 Microsoft Access 帮助、 在 Office 助手或应答向导中,键入 优化性能,然后单击 搜索 以查看相关主题。
有关优化性能,在 Microsoft Access 2002 中的详细信息单击 Microsoft Access 帮助帮助 菜单的类型上 提高性能的一个 Access 数据库 在 Office 助手或应答向导中,然后单击 搜索 以查看相关主题。

有关提高性能,在 Access 2003 中的详细信息单击 帮助 菜单的类型在 搜索提高性能,Access 数据库的 协助窗格中框,然后单击以查看该主题的 开始搜索 上的 Microsoft Office Access 帮助

有关在 Access 2000 中使用索引的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
209564ACC2000: 复合索引必须限制第一个索引的字段

属性

文章编号: 209126 - 最后修改: 2007年11月28日 - 修订: 2.5
这篇文章中的信息适用于:
  • Microsoft Office Access 2003
  • Microsoft Access 2002 标准版
  • Microsoft Access 2000 标准版
关键字:?
kbmt kbquery kbhowto kbperformance kbinfo kbusage KB209126 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 209126
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com