我有一个Access 2003 DB,我想提高它的性能.昨天,我读了一篇关于执行计划(展示计划)的文章,今天我为这个查询运行了我的展示计划:
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'
我该如何解释这两个查询计划?
在第二个Showplan中,这意味着,我应该为Plauskomponente,Name,ID创建索引吗?我应该为这三个字段创建一个复合索引吗?如何确定是否应该制作复合索引?
为什么Plauskommponente没有出现在第一个展示计划中?
最佳答案 在第二个Showplan中,这意味着:我应该把Plauskomponente,Name,ID的索引?我应该从这三个领域制作综合指数吗?我如何才能找到我应该制作复合索引?
这些名称出现在ShowPlan部分中,该部分显示了Jet在设计查询计划时所分析的信息.这三个字段的索引(单独的索引或基于所有三个的单个复合索引)对该特定查询没有帮助.实际上,添加索引会减慢其他操作…当您在索引字段中添加或删除行或编辑值时,db引擎必须将更改写入表和组合索引.
优化索引可能很棘手.索引可以加速SELECT,但减慢INSERT,DELETE和UPDATE操作.您需要为您的应用找到合适的平衡点.如果您在Access中相对较新,请从菜单的数据库工具部分尝试性能分析器向导.检查它提供的建议.很多时候,这些建议将涉及索引.您可以添加它建议的索引,如果它们降级或不提高整体性能,则稍后删除它们.
为什么Plauskommponente没有出现在第一个展示计划中?
甘拜下风.我猜测查询规划器已经找到了Names索引,所以认为查找其他索引毫无意义.
然而,这带来了另一个重要的观点.该表包含1,553行,但Plauskomponente仅包含3个不同的值.由于具有如此低的可变性,Plauskomponente上的索引甚至可能不会用于具有基于Plauskomponente的WHERE子句的查询的计划中. @Namphibian在评论中提到了原因.读取索引以找出哪些行符合标准,然后读取匹配的行可能比忽略索引和读取表中的所有行更昂贵.
最后请注意ShowPlan信息部分中提到的统计信息.压缩数据库时会更新这些统计信息.因此,压缩对于为查询计划程序提供最新信息非常有用,因为它决定如何优化查询计划.