ВЫБЕРИТЕ СЧЕТ (*) с ЗАКАЗАТЬ - PullRequest
9 голосов
/ 31 января 2012

Будут ли следующие два запроса выполняться одинаково?

SELECT COUNT(*) from person ORDER BY last_name;

и

SELECT COUNT(*) from person;

В любом случае они должныотображать те же результаты, поэтому мне было любопытно, если ORDER BY просто игнорируется.

Причина, по которой я спрашиваю, заключается в том, что я отображаю разбитую на страницы таблицу, где я получаю 20 записей одновременно из базы данныхзатем запускает второй запрос, который подсчитывает общее количество записей.Я хочу знать, должен ли я использовать те же критерии, которые использовались в первом запросе, или мне следует удалить всю сортировку из критериев?

Ответы [ 3 ]

11 голосов
/ 31 января 2012

Согласно плану выполнения, два запроса различны. Например, запрос:

select count(*) from USER

даст мне:

INDEX (FAST FULL SCAN)  3.0 3   453812  3457        1   TPMDBO  USER_PK FAST FULL SCAN  INDEX (UNIQUE)  ANALYZED

Как видите, мы нажимаем USER_PK, который является первичным ключом этой таблицы.

Если я сортирую по неиндексированному столбцу:

select count(*) from USER ORDER BY FIRSTNAME --No Index on FIRSTNAME

Я получу:

TABLE ACCESS (FULL) 19.0    19  1124488 3457    24199   1   TPMDBO  USER    FULL    TABLE   ANALYZED    1

То есть мы провели полное сканирование таблицы (НАМНОГО более высокую стоимость узла)

Если я сортирую по первичному ключу (который уже является индексом), Oracle достаточно умен, чтобы использовать индекс для такой сортировки:

INDEX (FAST FULL SCAN)  3.0 3   453812  3457    13828   1   TPMDBO  USER_PK FAST FULL SCAN  INDEX (UNIQUE)  ANALYZED

Что очень похоже на первый план выполнения.

Итак, ответ на ваш вопрос абсолютно нет - они не одинаковы. Однако упорядочение по индексу, который Oracle все равно ищет, вероятно, приведет к тому же плану запросов.

1 голос
/ 31 января 2012

Оптимизатор запросов Oracle действительно выполняет сортировку (я проверял это, глядя на план объяснения) для первой версии, но, поскольку оба запроса возвращают только одну строку, разница в производительности будет очень небольшой.

РЕДАКТИРОВАТЬ:

Майк ответ правильный.Разница в производительности может быть значительной.

1 голос
/ 31 января 2012

Конечно нет.Если фамилия не является первичным ключом, и вы уже заказаны этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...