我有一个Access 2003数据库,我想提高它的性能。昨天,我读了一篇关于执行计划(Show Plan)的文章,今天我为这个查询运行了我的show Plan:
SELECT tb_bauteile_Basis.*
FROM tb_bauteile_Basis
ORDER BY tb_bauteile_Basis.Name;我在Name字段上建立了索引,并显示了它的查询计划:
Inputs to Query -
Table 'tb_bauteile_Basis'
Using index 'Name'
Having Indexes:
Name 1553 entries, 17 pages, 1543 values
which has 1 column, fixed
ID 1553 entries, 4 pages, 1553 values
which has 1 column, fixed, clustered and/or counter
- End inputs to Query -
01) Scan table 'tb_bauteile_Basis'
Using index 'Name'接下来,我从Name中删除了索引,新的查询计划是:
- Inputs to Query -
Table 'tb_bauteile_Basis'
Using index 'PrimaryKey'
Having Indexes:
PrimaryKey 1553 entries, 4 pages, 1553 values
which has 1 column, fixed, unique, clustered and/or counter, primary-key, no-nulls
Plauskomponente 1553 entries, 4 pages, 3 values
which has 1 column, fixed
Name 1553 entries, 17 pages, 1543 values
which has 1 column, fixed
ID 1553 entries, 4 pages, 1553 values
which has 1 column, fixed, clustered and/or counter
- End inputs to Query -
01) Scan table 'tb_bauteile_Basis'
Using index 'PrimaryKey'我应该如何解释这两个查询计划?
在第二个显示计划中,这意味着我是否应该为Plauskomponente,Name,ID创建索引,以及是否应该为这三个字段创建复合索引?我如何确定是否应该建立一个综合指数?
为什么Plauskommponente没有出现在第一个展示计划中?
发布于 2012-04-17 23:15:58
在第二个展示计划中,这意味着:我应该为Plauskomponente,Name,ID?我应该从这三个字段中创建一个综合指数吗?我怎样才能发现我应该做一个综合指数?
这些名称出现在ShowPlan部分中,该部分显示了Jet在设计查询计划时分析的信息。这3个字段上的索引,无论是单独的索引还是基于所有这三个字段的单个复合索引,都不会对特定的查询有所帮助。实际上,添加索引会减慢其他操作的速度。在添加或删除行,或编辑索引字段中的值时,数据库引擎必须将更改写入表和复合索引。
优化索引可能很棘手。索引可以提高SELECT速度,但会降低插入、删除和更新操作的速度。您需要为您的应用程序找到合适的平衡。如果您是Access中的新手,请尝试菜单的数据库工具部分中的性能分析器向导。检查它提供的建议。很多时候,这些建议都会涉及到索引。您可以添加它建议的索引,如果它们降级或不能提高您的整体性能,则可以稍后删除它们。
为什么Plauskommponente没有出现在第一个展示计划中?
难倒我了。我猜查询规划器已经找到了名称索引,因此认为查找其他索引没有意义。
然而,这带来了另一个重要的问题。该表包含1,553行,但Plauskomponente仅包含3个不同的值。由于可变性如此之低,在具有基于Plauskomponente的WHERE子句的查询的计划中,很可能不会使用Plauskomponente上的索引。@Namphibian在一条评论中提到了原因。读取索引以找出哪些行与标准匹配,然后读取匹配的行,这可能比仅仅忽略索引并从表中读取所有行的成本更高。
最后,请注意ShowPlan信息部分中提到的统计数据。这些统计信息会在压缩数据库时更新。因此,当查询规划器做出关于如何优化查询计划的决策时,压缩对于为查询规划器提供最新的信息非常有用。
发布于 2012-04-17 19:21:59
查询正在读取整个表。你没有where子句。您不太可能对其进行优化。你能做的就是只选择你需要的列。这减少了传回的数据量。添加索引不会加快查询速度,因为您没有where子句。如果添加了where子句并对where子句中使用的那些字段进行了索引,则可能能够优化查询。
https://stackoverflow.com/questions/10189380
复制相似问题