Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

Получение декартового произведения

HyTech не строит декартового произведение заданного запросом типа:

select * from BOOK b, REPORT r;

Чтобы построить декартово произведение для двух или нескольких таблиц, надо дополнить каждую из таблиц полем типа char(1) и заполнить его одинаковым для всех перемножаемых таблиц значением, например, нулем (пусть, например, это будет поле CH). Далее выполняем соединение таблиц по вновь добавленному полю:

if (table_exists('BOOK') > 0)   drop table BOOK; create table BOOK (   ID        dword surrogate,   ID_AUTHOR dword not null,   ID_PH     dword not null,   PYEAR     word  not null,   UDC       char(50),   NAME      char(100) not null,   CH        char(1) ); insert into BOOK (ID_AUTHOR, ID_PH, NAME, PYEAR, CH) values (1, 1, 'Мертвые души', 2008, 0); insert into BOOK (ID_AUTHOR, ID_PH, NAME, PYEAR, CH) values (1, 1, 'Ревизор', 2008, 0); if (table_exists('REPORT') > 0)   drop table REPORT;   create table REPORT (   ID        dword surrogate,   ID_JOUR   dword not null,   ID_AUTHOR dword not null,   PYEAR     word,   CONTENTS  char(200),   NAME      char(100) not null,   CH        char(1) ); insert into REPORT (NAME, ID_AUTHOR, ID_JOUR, CH) values ('Письмо потомкам', 1, 1, 0); insert into REPORT (NAME, ID_AUTHOR, ID_JOUR, CH) values ('Письмо другу', 1, 2, 0); select   b.NAME as BOOKNAME,   r.NAME as REPORT from   BOOK b , REPORT r where   b.CH = r.CH;

Использование ключевых полей в запросах

Использование суррогатного ключа вместо уникального ключа

Поля, используемые для связи между таблицами, лучше объявлять суррогатными, а не уникальными. Суррогатный ключ практически не замедляет операции добавления-модификации, в то время как уникальные поля эти операции замедляют.

Использование неуникального ключа вместо уникального 

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

Использование ключевого поля вместо неключевого

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

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

Выделение длинных неключевых полей в отдельную таблицу

Длинные неключевые поля для часто изменяемой таблицы, по которой часто производятся поиски, лучше выделить в отдельную таблицу. Этим можно сократить размер переменной части таблицы, что приведет к сокращению времени поиска.

Расположение суррогатного ключа в начале строки 

Располагая суррогатный ключ в начале строки таблицы, можно несколько ускорить операции модификации, особенно для таблиц с большой постоянной частью.

4.10 Оптимизация поисковых запросов

Поиск в результатах предыдущего поиска

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

Режим поиска задается SQL-функцией subsearch.

Таблица TEST была наполнена тестовыми данными с помощью следующего скрипта:

if (table_exists('TEST') > 0) drop table TEST; create table TEST (   ID dword surrogate,   NAME char(100) );

var @i = 0;

while ( @i < 10000) {   insert into TEST(NAME) values ('test'+@i);   inc(@i); }

Пример. Найти записи, номер которых меньше 6000 и название которых содержит «test*».

select   * from   TEST where   NAME like 'test*' and   ID < 6000;

Оптимизированный запрос:

(Условия в конструкции where переставлены так, чтобы сначала обрабатывался наиболее быстрый, а затем более медленный поиск).

subsearch(1); select   * from   TEST where   ID < 6000 and   NAME like 'test*';