2013-04-10 1 views
1

У меня есть TABLE_A (С1, С2, С3, ....., Cn, штамп даты)Аналитические характеристики функции дорогостоящими

Примечание: Колонка штамп даты индексируется

QRY1

select * from 
(select max(datestamp) dates from table_A) t, 
table_A 
where a.datestamp = t.dates 

QRY2

select * from (
    select a.* , max (datestamp) over() dates from table_A a)) 
    where datestamp = dates 

Объясните Paln из QRY1 с помощью индексированного сканирования (execyted в 1 сек) стоимость была очень меньше.

Но для QRY2 для полного сканирования таблицы (исполненной за 8 секунд) стоимость была очень высокой.

Просто хотел знать, почему аналитическая функция игнорирует индексы.

Благодаря (я usig PL/SQL Oracle 10g)

+0

Это действительно интересный пример. если у вас есть индекс по датам, тогда первый подзапрос в QRY1, вероятно, сделает «MIN/MAX» сканирование (стоимость спуска по дереву, возможно, ~ 3), а затем выборка строки с использованием того же индекса - одной строки. Я предполагаю, что он не уникален, поэтому сканирование диапазона (вероятно, стоит около ~ 4), так что это довольно быстро. аналитическая функция с другой стороны - вероятно, сортировать данные, которые вызывают полное сканирование таблицы, поэтому это намного дороже. вы должны использовать аналитические функции, в которых вы используете агрегированную функцию на * частях * данных (раздел по разделу). – haki

ответ

3

Из documentation:

Аналитические функции вычислить суммарную величину, основанную на группе строк. Они отличаются от агрегатных функций тем, что они возвращают несколько строк для каждой группы.
...
Аналитические функции - это последний набор операций, выполненных в запросе, за исключением окончательного предложения ORDER BY . Все соединения и все предложения WHERE, GROUP BY и HAVING завершаются до обработки аналитических функций.

Ваш внутренний выбор вытягивает все строки из вашего стола, потому что он не имеет оговорки where; поскольку он должен извлекать каждую строку, индекс не помогает, и он также может выполнять полное сканирование таблицы. Использование индекса на datestamp было бы хуже - ему пришлось бы выполнить полное сканирование индекса, а затем получить доступ к каждой строке данных в любом случае, увеличив IO. Если вы запустите внутренний select самостоятельно, вы увидите, что он возвращает много строк, а не только один.

Внешний выбор затем соответствует определенной строке (или строкам) из внутренней. Это сравнение не может быть перенесено во внутренний выбор из-за того, когда в процессе вычисляется аналитическое значение.

+0

Спасибо Alex Итак, вы говорите, чтобы получать последние данные из ежедневной таблицы транзакций, мы должны пойти на обычную концепцию sub qry (QRY 1 в приведенном выше примере) Аналитика не будет работать эффективно. – Avi

+0

@Avi - в этом случае, вытаскивая одну запись на основе индексированного значения, тогда да, ваше тестирование показало, что оно более эффективно. –

+0

Ok Alex .. спасибо за ваш ответ :) – Avi

 Смежные вопросы

  • Нет связанных вопросов^_^