Расширенная оптимизация подзапросов в Oracle

Расширение возможностей выполнения запросов


В запросе Q7 предикат раздела HAVING отфильтровывает группы, имеющие, по крайней мере, одну запись с датой прихода (receipt date), большей даты завершения (commit date). Неудовлетворение этого и других предикатов, таких как MIN(l_receiptdate) > '18-FEB-2001', COUNT(*) <= 10, SUM(amount_sold) < 2000, немедленно делает группу неприемлемой (т.е. исключают ее из кандидатов в результирующий набор данных), и такие предикаты могут быть вытолкнуты в раздел GROUP BY для ускорения процесса агрегирования этой группы. Это приводит к эффективному выполнению. Например, в Q7 входная запись с l_receiptdate > l_commitdate делает равным единице значение агрегата SUM для соответствующей группы, исключая, таким образом, группу из списка кандидатов. Аналогично, если в качестве предиката используется SUM(amount_sold) < 2000, и в базе данных имеется ограничение, указывающее, что значение amount_sold должно быть положительным, то группа исключается из списка кандидатов, как только значение SUM для нее превысит 2000. Раздел GROUP BY в подобных случаях позволяет не производить агрегацию для групп, исключенных из списка кандидатов.

Использование таких предикатов также приносит пользу при выполнении параллельной группировки, снижая трафик передачи данных. В Oracle применяется метод параллельного проталкивания группировки (group-by pushdown, GPD) на основе оценки стоимости, который проталкивает выполнение группировки в процессы, производящие данные (подчиненные процессы-производители, producer slave), с целью сокращения коммуникационных расходов и повышения уровня масштабируемости группировки. Процессы, производящие данные, распределяет локально агрегированные данные между другими процессами (подчиненными процессами-потребители, consumer slave) на основе хеширования или диапазонов значений ключей группировки. Затем подчиненные процессы-потребители завершают выполнение группировки и производят результаты. План параллельного выполнения запроса Q7 с GPD представлен на рис. 1. Сокращение трафика достигается, если подчиненные процессы-производители P1, ..., PN во время выполнения группировки отфильтровывают группы, основываясь на предикатах раздела HAVING.

Рис.1. Проталкивание в параллельной группировке

Аналогичным образом, предикаты, удовлетворение которых приводит к немедленному включению групп в список кандидатов в результирующий набор данных, также могут быть вытолкнуты в обработку группировки. Обработку агрегации групп, не входящих в результирующий набор, можно пропустить, как только найдется группа, являющаяся кандидатом. Примеры таких предикатов: MIN(l_receiptdate) < '18-FEB-2001', COUNT(*) > 10, SUM(amount_sold) > 2000, если известно, что amount_sold положительно.



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