265
// таблице «Работник»
LOCATE ALL // перебирать всю таблицу работников
DO WHILE FOUND() // пока не дошли до конца таблицы
SELECT PI // перевести фокус на таблицу переменной
информации
LOCATE FOR ID_MEN = MEN.ID AND DAT <= DATE()
// искать все записи в таблице переменной,
// относящиеся к текущему работнику и внесенные
// до текущей даты
DO WHILE FOUND() // пока записи находятся
S.ID = PI.ID // запоминать УИД записи
CONTINUE // и искать следующую
ENDD
SEEK S.ID // перейти на последнюю из найденных записей
IF PI.OPER != VVOD // если признак операции не «уволен»
PRINT MEN.FIO // вывести на экран фамилию работника
END IF
SELECT MEN // вернуть фокус на таблицу работников
CONTINUE // и искать следующего работника
ENDD // конец цикла
Оценим количество записей, которое будет считано в ходе работы этого
фрагмента. Пусть ИС работает в течение 5 лет на среднем предприятии с
численностью работников 1000 человек. Обычная текучесть кадров составляет
от 10% до 20% в год, следовательно, за 5 лет в таблице работников накопится
примерно 1000 * (1+0.15*5) = 1750 записей. В современных условиях
нормально, что каждый год изменяется оклад работника, поэтому 1000
постоянных работников будут иметь, как минимум, по 5 записей в таблице
переменной информации, а уволенные – на одну (увольнение) больше.
Следовательно, таблица переменной информации будет содержать 1000*5 +
750*6 = 9500 записей. При фронтальном переборе приведенный фрагмент
программы переберет 1750 + 1750*9500 = 16.626.750 записей; из расчета 0,001
с/запись это займет 27 минут. При использовании индекса время перебора всех
записей таблицы переменной информации пропорционально
2
C C
, где
. То есть даже при использовании индекса вывод
списка работников на экран замедлится минимум в 13 раз!
Кроме того, структура таблицы «работник» вряд ли будет настолько
простой. Для работы отдела кадров, как показывают исследования документов,
необходима примерно следующая структура таблиц «Работники» и других (рис.
117).