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