2015-03-23 4 views
2

У меня есть база данных, которая отслеживает посещаемость для учащихся в школе. Есть одна таблица (SpecificClasses) с датами всех классов и другая таблица (Attendance) со списком всех учеников в каждом классе и их посещаемость в этот день.Использует расчетные поля в эффективности повышения доступа

Школа хочет иметь возможность просматривать эти данные различными способами и фильтровать их по многим различным параметрам. (Я не буду вставлять весь запрос здесь, потому что он довольно сложный, и детали не важны для моего вопроса.) Один из их вариантов, которые они хотят, - это просмотр посещаемости конкретного ученика в определенный день недели. Смысл, они хотят быть в состоянии заметить, если студент отсутствует каждый вторник или что-то в этом роде.

Чтобы сделать запрос возможным, я использовал DatePart("w",[SpecificClasses]![Day]). Однако выполнение этого в каждом классе (когда мы говорим о сотнях классов, взятых одним учеником за один семестр), довольно трудоемко. Поэтому я подумывал хранить день недели вручную в таблице SpecificClasses или, возможно, даже в таблице Attendance, чтобы избежать объединения, и просто быть очень осторожным в своих мероприятиях, чтобы поддерживать эти данные в актуальном состоянии (что означает заполнять информацию, когда секретари вставляют новый SpecificClass или исправляют поле Day).

Тогда мне было интересно, могу ли я просто вычислить поле, которое сохранит это значение. (В школе есть Access 2010, поэтому мне не нужно беспокоиться о совместимости). Если я создаю вычисленное поле, действительно ли Access фактически сохраняет это поле и запоминает его в будущем и не должен каждый раз пересчитывать его?

ответ

2

Как упоминает HansUp в своем ответе, вычисленное поле не может быть проиндексировано, поэтому оно может не дать вам большого увеличения производительности.Однако, так как вы используете Access 2010 можно создать «реальный» поле типа Integer с именем [WeekdayNumber] и поставить индекс на нем,

TableDesign.png

, а затем использовать до изменения data macro для вставки значения Weekday() для вы:

BeforeChange.png

(. Weekday() функция дает тот же результат, как и DatePart("w", ...))

+1

Прохладный. Я вижу, что Access 2010 имеет немало преимуществ по сравнению с 2007 годом (изначально я использовал для записи базы данных). – clum

2

Мне было интересно, могу ли я просто вычислить поле, которое сохранит это значение.

Нет, не для вычисленного выражения поля, которое использует DatePart(). Access поддерживает ограниченный набор функций для вычисленных полей, а DatePart() не является одним из них.

Если создать вычисляемое поле, имеет доступ фактически сохранить это поле и помните, что в будущем и не придется пересчитывать его каждый время?

Не относится к вашему текущему случаю. Но для вычисленного поля, которое Access будет принимать, да, так оно и работает.

Однако вычисленное поле не может быть проиндексировано так, чтобы ограничивать, какое улучшение он может предложить с точки зрения скорости поиска данных. Если вы столкнулись с другой ситуацией, когда вы можете создать допустимое вычисленное поле, проверьте производительность, чтобы увидеть, заметили ли вы какое-либо улучшение (или вычисление значения в запросе).

Для проблемы с запросом DatePart() рассмотрите вопрос о создании таблицы календаря со строкой для каждой даты и укажите номер недели в качестве отдельного проиндексированного поля. Затем вы можете присоединиться к таблице календаря в свой запрос, избегать необходимости снова вычислять DatePart() и разрешать Access использовать индексированный номер дня недели, чтобы быстро определить, какие строки соответствуют интересующему день недели.

+1

вычисляемое поле можно использовать 'Weekday()', но ваша мысль о невозможности индексирования вычисленных полей является хорошей. –

+0

Хорошая точка, Горд! Я не думал о 'Weekday()' – HansUp

+0

Итак, если бы я использовал 'Weekday()', это дало бы то преимущество, что его не нужно было бы рассчитывать каждый раз, что лучше, чем у меня сейчас, но Я бы не получил преимущество индекса, поэтому лучше пойти с моим собственным регулярно обновляемым полем (как я в основном предложил в вопросе, и Горд Томпсон предложил способ его реализации)? – clum

 Смежные вопросы

  • Нет связанных вопросов^_^