Почему Макс () создает заказ в плане объяснения? - PullRequest
1 голос
/ 05 марта 2010

Когда я пытаюсь сделать что-то вроде

SELECT Max(ObjectId) FROM Objects;

, я вижу это в плане объяснения, что это выполняется с помощью сортировки.Теперь сортировка (которая, я думаю, потребует чего-то сложного O(nlogn)) должна быть намного дороже, чем просто сканирование каждой строки и запоминание максимального значения (что можно сделать в O(n)).

Я что-то здесь упускаю?Оракул действительно выполняет сортировку, или план объяснения просто использует описание «сортировка» для описания простого сканирования всех значений в столбце ObjectId?Если oracle действительно выполняет «настоящую сортировку», есть ли веская причина для этого, чего мне не хватает?

Заранее спасибо!

1 Ответ

5 голосов
/ 05 марта 2010

, так как вы не опубликовали подробности о вашей таблице Objects, нам придется угадывать. Я предполагаю, что у вас есть индекс на ObjectId. В этом случае вы увидите шаг INDEX FULL SCAN (MIN / MAX) в плане объяснения, означающий, что данные будут извлечены непосредственно из индекса. Ключи упорядочены в индексе, поэтому чтение первого или последнего ключа дает вам МИН / МАКС.

Это операция O (log n) (поскольку она зависит от глубины индекса).

Обновление:

Если у вас нет индекса ObjectId, вы увидите шаг SORT AGGREGATE в плане объяснения. Это не значит, что весь набор будет отсортирован. На самом деле данные будут агрегированы по мере чтения. Это, вероятно, потребует отдельного сравнения для каждой строки, что даст вам общую стоимость O (n).

Также в соответствующей заметке Oracle, вероятно, использует O (n) алгоритмов для сортировки данных.

...