Database Programming & Design



         

Синергия - часть 2


Например, следующий оператор можно было бы использовать в

налоговом управлении для создания таблицы, в которой должны

регистрироваться земельные участки, находящиеся в частной

собственности:

CREATE TABLE properties

(taxid Char(6) PRIMARY KEY,

owner Varchar(32),

assessment Dollars,

parcel Polygon);

Для нахождения собственников больших участков можно использовать следующий запрос на языке SQL:

SELECT owner, area(parcel)

FROM properties

WHERE area(parcel) > 20000;

Наиболее эффективный способ выполнения этого запроса мог бы

базироваться на использовании индекса, обеспечивающего прямой

доступ к участкам по значению их площади. Поддержка индексов на

UDF находится в планах развития DB2, но пока ее нет. Но возможно

другое решение, позволяющее выполнить запрос с той же

эффективностью. Добавим к таблице PROPERTIES новый столбец,

который должен содержать заранее вычисленный размер площади, и

создадим триггеры для поддержки корректных значений этого

столбца. Для добавления столбца можно использовать оператор SQL

ALTER TABLE properties

ADD COLUMN area Double;

Теперь определим триггеры, которые активируются при выполнении

над таблицей PROPERTIES операторов INSERT и UPDATE. Вот как могло

бы выглядеть определение триггера для INSERT:

CREATE TRIGGER insertprop

NO CASCADE

BEFORE INSERT ON properties

REFERENCING NEW AS newrow

FOR EACH ROW MODE DB2SQL

SET newrow.area =

area(newrow.area);

Поскольку площадь каждого участка автоматически вычисляется и

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

по значению их площади можно создать индекс на столбце AREA:

CREATE INDEX proparea ON

properties(area);

Теперь перепишем запрос в форме, которая даст возможность DB2

использовать этот индекс:

SELECT owner, area

FROM properties

WHERE area > 20000;




Содержание  Назад  Вперед