Базы данных Oracle - статьи

         

Вытягивание предиката


Преобразование "вытягивание предиката" (Predicate Pullup) фильтрации вытягивает дорогостоящие предикаты фильтрации из представления в запрос, содержащий это представление. В настоящее время предикат считается дорогостоящим, если он содержит процедурные функции SQL, определяемые пользователем операции или подзапросы. Преобразование "вытягивание предиката" в настоящее время принимается во внимание, только если в запросе, содержащем представление, указан предикат rownum, и в представлении имеется блокирующая операция.

Рассмотрим следующий запрос, содержащий представление с двумя дорогостоящими предикатами:

Q16

SELECT * FROM (SELECT document_id FROM product_docs WHERE containts(summary,'optimizer',1) > 0 AND containts(full_text,'execution',2) > 0 ORDER BY create_date) V WHERE rownum <= 20;

Поскольку в представлении имеются два дорогостоящих предиката, существуют три способа, которыми может быть выполнено преобразование вытягивания предиката, один из которых приведен ниже:

Q17

SELECT * FROM (SELECT document_id, value(r) as vr FROM product_docs WHERE containts(full_text,'execution',2) > 0 ORDER BY create_date) V WHERE containts(summary,'optimizer',1) > 0 AND rownum <= 20;

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



Содержание раздела