在Access中使用计算字段是否会提高效率

时间:2015-03-23 15:58:52

标签: sql ms-access database-design calculated-field

我有一个数据库,可以跟踪学校学生的出勤情况。有一个表(SpecificClasses)包含所有类的日期,另一个表(Attendance)包含每个班级中所有学生的列表以及当天的出勤情况。

学校希望能够以多种不同的方式查看数据,并根据许多不同的参数对其进行过滤。 (我不会在这里粘贴整个查询,因为它非常复杂,细节对我的问题并不重要。)他们想要的一个选项是查看特定学生在一周中某一天的出勤情况。意思是,他们希望能够注意到每个星期二学生是否缺课等等。

为了使查询能够做到这一点,我使用了DatePart("w",[SpecificClasses]![Day])。但是,在每个课程上运行此课程(当我们在一个学期讨论一个学生所参加的数百个课程时)非常耗时。所以我在考虑将一周中的某一天手动存储在SpecificClasses表中,或者甚至可能在Attendance表中存储,以便能够避免加入,并且在我的事件中要非常小心保持这些数据是最新的(意味着当秘书插入新的SpecificClass或修复Day字段时填写信息)。

然后我想知道我是否可以创建一个存储该值的计算字段。 (学校有Access 2010,所以我不必担心兼容性)。如果我创建一个计算字段,Access是否实际存储该字段并记住它以供将来使用,而不必每次都重新计算它?

2 个答案:

答案 0 :(得分:2)

  

我想知道我是否可以制作一个计算字段   会存储这个值。

不,不适用于使用DatePart()的计算字段表达式。 Access支持计算字段的一组有限功能,DatePart()不是其中之一。

  

如果我创建一个计算字段,Access是否实际存储该字段   并记住它的未来,而不必每次都重新计算它   时间?

不适用于您当前的情况。但是对于Access可以接受的计算字段,是的,这就是它的工作方式。

但是,计算字段无法编入索引,因此限制了它在数据检索速度方面可以提供多少改进。如果您遇到另一种可以创建有效计算字段的情况,请测试性能以确定是否发现任何改进(与计算查询中的值相比)。

对于DatePart()查询问题,请考虑为每个日期创建一个包含行的日历表,并将工作日编号作为单独的索引字段包含在内。然后,您可以将日历表加入到查询中,避免再次计算DatePart(),并允许Access使用索引的工作日编号快速识别哪些行与感兴趣的工作日匹配。

答案 1 :(得分:2)

正如HansUp在他的回答中提到的,计算字段无法编入索引,因此可能无法为您带来太多的性能提升。但是,由于您使用的是Access 2010,因此您可以创建名为[WeekdayNumber]的“真实”整数字段并在其上添加索引,

TableDesign.png

然后使用Before Change data macro为您插入Weekday()值:

BeforeChange.png

Weekday()函数提供与DatePart("w", ...)相同的结果。)