|
Программирование >> Построение запросов sql
Конструкция DROP столбец используется для удаления существующего столбца таблицы. Удаление столбца запросом ALTER TABLE может завершиться неудачей в следующих случаях: - удаляемый столбец является частью ограничений UNIQUE, PRIMARY KEY или FOREIGN KEY; - удаляемый столбец используется в предложении CHECK; - удаляемый столбец является частью выражения, например, в конструкции COMPUTED [ВУ] (<выражение>) (при создании таблицы); - на удаляемый столбец ссылается другой объект БД, например представление. Удаление ограничения таблицы производится при использовании предложения DROP CONSTRAINT запроса ALTER TABLE с указанием имени ограничения. Если при создании таблицы (CREATE TABLE) или изменении ее определения (ALTER TABLE) не задавалось имя ограничения, то удаление такого ограничения становится невозможным. Например, чтобы удалить ограничение, наложенное на таблицу и имеющее имя Abonent not as Executor, необходимо воспользоваться следующим запросом: ALTER TABLE Abonent DROP CONSTRAINT Abonent not as Executor;. 4.3. Индексы Одним из структурных элементов физической памяти, присутствующим в большинстве современных реляционных СУБД, является индекс. Индекс - это средство, обеспечивающее быстрый доступ к строкам таблицы на основе значений одного или нескольких ее столбцов [19, 23]. В индексе хранятся значения данных и указатели на строки, где эти данные встречаются. При выполнении запроса СУБД сначала определяет список индексов, связанных с данной таблицей. Затем устанавливает, что является более эффективным, просмотреть всю таблицу или для обработки запроса использовать существующий индекс. Если СУБД решает использовать индекс, то поиск ведется сначала по ключевым значениям в индексе, а затем, используя указатели, осуществляется просмотр самих таблиц для дополнительной фильтрации и окончательной выборки требуемых данных. Поиск осуществляется достаточно быстро, поскольку значения в индексе упорядочены (в убывающем или возрастающем порядке), а сам индекс относительно невелик. Это позволяет найти ключевое значение. Как только ключевое значение найдено, по указателю определяется физическое местоположение связанных с ним данных. Использование индекса обычно требует меньшего количества обращений к диску, чем последовательное чтение строк в таблице. Тем не менее, индексирование оправданно далеко не всегда. Следует помнить, что при всяком обновлении данных должны обновляться и индексы. Таким образом, платой за быстрый поиск является увеличение затрат времени на обновление данных. Кроме того, сами индексы после большого числа обновлений становятся несбалансированными, вследствие чего время поиска по ним возрастает. В этих условиях при проектировании БД необходимо находить компромисс между требованиями по ускорению поиска данных и по скорости их обновления. Использование индексов, например, для небольших по объему таблиц вообще не оправданно. Если имеется индекс по группе полей, то поиск по первому из полей группы может прямо использовать этот индекс, следовательно, нет смысла делать по нему отдельный индекс. Если поиск по каким-либо полям редок, то построение по ним индекса неэффективно. В то же время индексирование может дать большой эффект при работе с данными, которые часто используются, но редко меняются, например в таблицах-справочниках. Если часто используются запросы, требующие соединения таблиц по какому-либо полю или группе полей, то от индексирования таблиц по этим полям может быть получен значительный эффект. Кроме того, индекс может быть полезен, если часто выполняется сортировка данных по столбцу или группе столбцов. Можно сказать, что оптимальный выбор состава и количества индексов зависит и от структуры БД, и от характера ее использования. В СУБД Firebird автоматически создаются индексы по первичным, внешним ключам таблиц и UNIQUE-ограничениям и их дополнительно создавать не нужно. Такие индексы для ограничений без имени по умолчанию имеют название наподобие RDB$PRIMARY8, RDB$FOREIGN13, RDB$10 и т.д., а для ограничений с именем название индекса совпадает с названием ограничения. Данные в таких индексах по умолчанию располагаются в возрастающем порядке. Рекомендуется создавать индекс для столбцов, которые часто используются в условиях поиска. В SQL индекс для таких столбцов создается запросом CREATE INDEX, который имеет следующий формат: CREATE [UNIQUE] [ASC DESC] INDEX имя индекса ON базовая таблица {(<список столбцов>) COMPUTED BY (<выражение>)};, - имя индекса, задает имя, под которым создаваемый индекс будет определен в БД; - базовая таблица и список столбцов, определяют соответственно базовую таблицу и индексируемые столбцы (столбец). Необязательные параметры запроса CREATE INDEX: - UNIQUE, предотвращает вставку или обновление повторяющихся значений в индексируемые столбцы; - ASC, сортирует столбцы в возрастающем порядке (используется по умолчанию); - DESC, сортирует столбцы в убывающем порядке. Например, для создания отсортированного по убыванию индекса с именем Month Index по полю NachislMonth таблицы NachislSumma необходимо применить следующий запрос: CREATE DESC INDEX Month Index ON NachislSumma (NachislMonth);. В некоторых случаях удобно создать составной индекс, т.е. индекс для нескольких столбцов в таблице. Например, если требуется часто осуществлять поиск и сортировку по адресам абонентов, то можно создать составной индекс для полей StreetCD и HouseNO таблицы Abonent. Запрос на создание такого индекса будет выглядеть следующим образом: CREATE INDEX Address Index ON Abonent (StreetCD, HouseNO);. Результатом выполнения данного запроса будет создание отсортированного по возрастанию индекса Address Index, который обеспечит ускорение поиска и сортировки по адресу абонента. Существует возможность проиндексировать выражения, часто применяемые в запросах. Индекс для выражения создается с помощью следующей конструкции: COMPUTED ВУ (<выражение>). Например, можно создать индекс для таблицы Request по выражению, извлекающему значение месяца из столбца IncomingDate, с помощью следующего запроса: CREATE INDEX Ind 1 ON Request COMPUTED BY (EXTRACT(MONTH FROM IncomingDate));. Данный индекс будет доступен для любого запроса с поиском или сортировкой, если они включают выражение EXTRACT(MONTH FROM IncomingDate). Индексы для выражений имеют точно такие же характеристики, как и индексы для столбцов, за исключением того, что они не могут быть составными. Как отмечалось, после описания ограничения таблицы может быть указана следующая конструкция: [USING [ASC[ENDING] DESC[ENDING]] INDEX имя индекса]. С помощью данной конструкции можно изменить имя индекса, создаваемого по первичному, внешнему или уникальному ключу таблицы, с системного на пользовательское имя и указать нужный порядок расположения данных в индексе. Т.е. можно осуществить переименование автоматически создаваемого индекса и изменение, если требуется, порядка данных в нем. Например, определим в ранее созданной таблице Days поле number как первичный ключ, задав для связанного с ним индекса имя PK NUMBER и порядок данных по убыванию: ALTER TABLE Days ADD PRIMARY KEY (number) USING DESC INDEX PK NUMBER;.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |