Методические указания к лабораторным работам для студентов специальности 210100 "Автоматика и информатика в технических системах"

Вид материалаМетодические указания
Лабораторная работа № 7 СРАВНИТЕЛЬНЫЙ АНАЛИЗ ВОЗМОЖНОСТЕЙ КОМАНД ДЛЯ ПОИСКА ДАННЫХ
1.Общие сведения
Set filter to [
Set filter to kod=105
Locate for
Use kdetlocate for kod > 150
2. Задание на работу
Подобный материал:
1   2   3   4   5   6   7   8

Лабораторная работа № 7

СРАВНИТЕЛЬНЫЙ АНАЛИЗ ВОЗМОЖНОСТЕЙ КОМАНД ДЛЯ ПОИСКА ДАННЫХ


Цель работы: изучить структуру и возможности команд для реализации поиска информации в ИСС средствами языка манипулирования данными СУБД реляционного типа FoxPro, провести сравнительный анализ быстродействия этих команд на отношениях различного объема.

1.ОБЩИЕ СВЕДЕНИЯ


В FoxPro имеются разнообразные команды поиска записей. Все их множество можно разделить на три группы, а именно: команды поиска по указателю; команды последовательного поиска по условию; команды ускоренного (дихотомного) поиска по условию(рис.4).



Рис.4

Кроме того, для поиска определенных записей можно использовать возможности фильтрации.

Хотя многие команды имеют в своей структуре FOR, WHILE <условия> и границы, которые ограничивают множество записей в отношениях, но часто более удобным является сделать такое ограничение для всех команд сразу и тем самым уменьшить размер этих всех команд. Это позволяет сделать команда:

SET FILTER TO [<условие>].

Здесь FOR <условие> указывает, какие именно записи доступны для обработки. Например, команда

SET FILTER TO NAMD = 'Д' ,

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

Команда действует только на открытую и активную в данный момент базу данных. Для каждой рабочей области может быть установлен свой фильтр.

Фильтр начинает действовать только в том случае, если после команды SET FILTER TO <условие> произведено какое-либо изменение указателя записи (например, SKIP)

Команда SET FILTER может быть использована для поиска, если FOR <условие> определить на единичном значении первичного ключа, например:

SET FILTER TO KOD=105,

где KOD – ключевое поле (первичный ключ) в отношении каталог деталей.

Команды поиска по указателю записи в свою структуру включают ссылку на конкретный номер записи. Имеется несколько разновидностей команд, изменяющих положение указателя записей:

GO TOP – переход на первую запись;
GO BOTTOM – переход на последнюю запись;
GO <выр.N> – переход к записи с номером <выр.N>;
SKIP <выр.N> – переход к записи, отстоящей от текущей на <выр.N> число записей.

В последней команде <выр.N> может быть и отрицательным, что означает движение указателя назад. SKIP без параметра идентичен SKIP 1 (переход на следующую запись). Все вышеперечисленные команды могут иметь дополнительный параметр IN <область>, указывающий, для какой области должна выполняться команда. Если он опущен, то имеется в виду текущая рабочая область.

Для контроля положения указателя и наличия записей в файле DBF предусмотрены функции:

RECNO ([область]) – указывает номер текущей записи;
RECCOUNT ([область]) – выдает общее число записей, включая помеченные к удалению;
EOF ([область]) – функция конца файла: возвращает .Т., если конец достигнут, и .F. - в противном случае;
BOF ([область]) – то же, но для начала файла.

Следующая команда осуществляет последовательный поиск одной, самой первой записи в активном отношении, удовлетворяющей заданному FOR <условию>, среди записей, находящихся в заданных границах, и до тех пор, пока соблюдается заданное WHILE <условие>.

LOCATE FOR <условие> [<границы>] [WHILE<условие>].

В случае, если границы и WHILE <условие> не заданы, поиск ведется во всем отношении, начиная с первой записи.

При успешном поиске указатель записи устанавливается на найденную запись, функция RECNO() возвращает номер этой записи, а функция FOUND(), оценивающая результат поиска, возвращает значение .Т. При неудачном поиске функция RECNO() равна числу записей в отношении плюс 1, а FOUND()=.F., a EOF()=.T.

При успешном результате поиска и при необходимости продолжения поиска следующей записи нужно активизировать команду CONTINUE. Если установлено SET TALK ON, то будет выводиться номер каждой найденной записи. Пример:

SET TALK ON
USE KDET
LOCATE FOR KOD > 150
DO WHILE .T.
IF EOF()
EXIT
ENDIF
CONTINUE
ENDDO

Операции поиска данных в информационных системах являются наиболее важными. Очевидно, что обеспечение их эффективности актуально. Ускоренный, дихотомный поиск в реляционных базах данных реализуется посредством индексных файлов.

Один файл .DBF может быть переиндексирован по нескольким полям, т.е. иметь несколько индексных файлов. Такие файлы содержат информацию о расположении записей файла базы данных, например, в алфавитном (символьные поля); хронологическом (поля типа D) или числовом порядке для того поля (полей), по которому выполнено индексирование. Допускается индексирование по логическим полям.

В принципе без индексирования можно обойтись, используя последовательный поиск, но для реальных баз данных получить приемлемо скоростные характеристики можно только индексированием. Однако за скорость нужно платить. Сами индексные файлы занимают некоторое место на диске, их объем ориентировочно оценивается пространством, занимаемым полем базы данных, по которому выполнено индексирование. Так, если проиндексировать файл .DBF по всем полям, то суммарный объем файлов IND будет близок к объему самого файла .DBF. Кроме того, замедляются операции ввода/редактирования, так как при дополнении новой записи индексный файл автоматически перестраивается в соответствии с новыми или измененными данными.

Индексный файл не только упорядочивает базу данных для просмотра, но и ускоряет поиск в ней по ключу, заданному в индексе, если пользоваться командой

SEEK <выражение>.

Эта команда использует алгоритм дихотомного поиска. При наличии индексного файла сначала именно в нем, а не в самой базе ведется дихотомный поиск номера записи с указанным в команде SEEK значением выражения в индексном поле. Такой поиск возможен только в упорядоченном файле, а индексный файл - это упорядоченный файл, в котором значения ключа расположены в определенном порядке. Найденному значению ключа в индексном файле однозначно соответствует номер физической записи, которая имеет такое значение ключа в файле. DBF, по этому номеру и устанавливается указатель записи в базе данных. Команда различает только одну первую запись, в которой в индексном файле находится <выражение>. Следовательно, индексный файл, с которым работает команда, как правило, содержит значения первичного ключа.

Функции RECNO(), FOUND(), EOF() реагируют на результаты поиска командой SEEK точно так же, как и командами LOCATE и СONTINUE.

Сущность дихотомного поиска заключается в следующем. Известно количество записей N в базе, это число делится на 2 и анализируется значение ключа в индексном файле расположенного в [N/2] месте (округленного до целого). Если значение <ключа> > <выражения>, то поиск ведется аналогично в нижней части индексного файла, если <ключ> < <выражения> – в верхней. В выбранной половине снова находится середина и определяется новая область поиска. И так до тех пор, пока не будет зафиксировано искомое совпадение либо не будет выявлено, что нужных данных нет. В первом случае указатель записи устанавливается на запись с найденным в индексном файле номером, во втором – вырабатывается EOF()=.T.

Предельное число сравнений при двоичном поиске оценивается выражением Log N по основанию 2, где N - число записей в базе данных. Это значит, что если база содержит 1024 записи, то в худшем случае потребуется 10 обращений к индексу для розыска нужной записи. При последовательном поиске в худшем случае (последняя искомая запись) потребуется 1024 просмотра.

2. ЗАДАНИЕ НА РАБОТУ


2.1. Используя учебные пособия [4-15], материал первого раздела данной лабораторной работы, системную документацию по СУБД или информационную подсистему по языкам СУБД в автоматизированной справочной системе NG, изучить структуру и возможности команд для организации поиска записей в базе данных.

2.2. Разработать командный файл, позволяющий организовывать заполнение одного определенного отношения тестовой информацией (заносить в базу заданное количество записей) и фиксировать время, нужное для поиска заданной записи.
  1. Провести экспериментальную оценку времени поиска записи в определенном отношении с различным числом записей и при различном расположении искомых записей различными способами. С этой целью заполнить нижеследующую табл.2.

Таблица 2

Способы поиска

Количество записей




5000

10000

50000

100000

1.Фильтрация отношения

С/К










2.Последовательный поиск













3.Технология Rushmore













4.Дихотомный поиск










С/К



В табл.2 символы С и К означают, что поиск следует вести соответственно в середине и конце отношения.

2.4.Представить текст командного файла и заполненную табл.2 к защите.