我有一个数据库,可以跟踪学校学生的出勤情况。有一个表(SpecificClasses
)包含所有类的日期,另一个表(Attendance
)包含每个班级中所有学生的列表以及当天的出勤情况。
学校希望能够以多种不同的方式查看数据,并根据许多不同的参数对其进行过滤。 (我不会在这里粘贴整个查询,因为它非常复杂,细节对我的问题并不重要。)他们想要的一个选项是查看特定学生在一周中某一天的出勤情况。意思是,他们希望能够注意到每个星期二学生是否缺课等等。
为了使查询能够做到这一点,我使用了DatePart("w",[SpecificClasses]![Day])
。但是,在每个课程上运行此课程(当我们在一个学期讨论一个学生所参加的数百个课程时)非常耗时。所以我在考虑将一周中的某一天手动存储在SpecificClasses
表中,或者甚至可能在Attendance
表中存储,以便能够避免加入,并且在我的事件中要非常小心保持这些数据是最新的(意味着当秘书插入新的SpecificClass或修复Day
字段时填写信息)。
然后我想知道我是否可以创建一个存储该值的计算字段。 (学校有Access 2010,所以我不必担心兼容性)。如果我创建一个计算字段,Access是否实际存储该字段并记住它以供将来使用,而不必每次都重新计算它?
答案 0 :(得分:2)
我想知道我是否可以制作一个计算字段 会存储这个值。
不,不适用于使用DatePart()
的计算字段表达式。 Access支持计算字段的一组有限功能,DatePart()
不是其中之一。
如果我创建一个计算字段,Access是否实际存储该字段 并记住它的未来,而不必每次都重新计算它 时间?
不适用于您当前的情况。但是对于Access可以接受的计算字段,是的,这就是它的工作方式。
但是,计算字段无法编入索引,因此限制了它在数据检索速度方面可以提供多少改进。如果您遇到另一种可以创建有效计算字段的情况,请测试性能以确定是否发现任何改进(与计算查询中的值相比)。
对于DatePart()
查询问题,请考虑为每个日期创建一个包含行的日历表,并将工作日编号作为单独的索引字段包含在内。然后,您可以将日历表加入到查询中,避免再次计算DatePart()
,并允许Access使用索引的工作日编号快速识别哪些行与感兴趣的工作日匹配。
答案 1 :(得分:2)
正如HansUp在他的回答中提到的,计算字段无法编入索引,因此可能无法为您带来太多的性能提升。但是,由于您使用的是Access 2010,因此您可以创建名为[WeekdayNumber]的“真实”整数字段并在其上添加索引,
然后使用Before Change data macro为您插入Weekday()
值:
(Weekday()
函数提供与DatePart("w", ...)
相同的结果。)