Классика баз данных - статьи

       

В преобразованном запросе мы выводим


SELECT DISTINCT itp.* FROM itp, itl WHERE itp.itemn = itl.itemn AND itl.wkcen = 'WK468' AND itl.locan = 'LOCA000IN';

В преобразованном запросе мы выводим одну копию каждого кортежа из itp? itl, такого что удовлетворяются соответствующие предикаты (включая предикат «itp.itemn = itl.itemn», который ранее подразумевался конструкцией «IN»). Поскольку никакие столбцы из itl не участвуют в окончательной проекции, и дубликаты удаляются, производится тот же результат, что и у исходного запроса.

Приведенный пример взят из среды измерения производительности, разъяснявщейся в разд. 2. Результаты измерений производительности показаны в таб. 10. После перезаписи мы получаем 32-кратное уменьшение время ЦП и 14-кратное уменьшение общего времени.. Во время преобразования правило DISTPU распознает, что в результате отсутствуют дубликаты. Затем правило EtoF преобразует подзапрос в табличное выражение, не добавляя к результату дополнительных ключей, поскольку уже установлено, что в результате нет дубликатов. После этого правило SELMERGE производит слияние табличного выражения, существенно повышая эффективность запроса.



Таб. 10. Перед перезаписью и после нее

Теперь мы можем сказать, почему подзапросы с кванторами существования булевских сомножителей под блоками блоками SELECT гарантированно сливаются. Рассмотрим какой-либо блок SELECT upper с булевским сомножителем – подзапросом SELECT (т.е. блоком SELECT, над которым определен E-квантификатор). По причине наличия правил EorAPDFR и DISTPDFR/TO мы можем предположить, что в подзапросе имеется body.distinct = PERMIT. Теперь мы хотим иметь возможность возбудить правило EtoF, но не можем это сделать, если upper.head.distinct = FALSE, upper.body.distinct = PRESERVE и для квантификатора между этими двумя блоками не соблюдается условие one-tuple-condition. В этом случае мы можем применить правило ADDKEYS, чтобы получить upper.head.distinct = TRUE, и тогда мы сможем применить правило EtoF. После его применения upper определяется над lower с использованием F-квантификатора, и lower.body.distinct != ENFORCE, так что удовлетворяются условия для возбуждения SELMERGE, и блок lower может быть слит с блоком upper.


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