2013-04-28 3 views
0

Я очень новичок в Oracle. И у меня есть таблица и некоторые вопросы здесь:Порядок выполнения запросов оракула sql

http://sqlfiddle.com/#!4/a7b7c/1

Интересно, как запрос:

select distinct name,id from test; 

и

select name,id from test group by name,id; 

производство же выхода. Как в oracle я могу найти порядок, в котором выполняется запрос выше? Его случайный для каждого данных? Или есть способ, которым он будет выполняться для всех наборов данных.

ответ

1

обычно, если вы хотите производительность отладки вы использовали бы объяснить план, как так:

EXPLAIN PLAN ДЛЯ SELECT DISTINCT NAME, ID FROM TEST;

РАЗЪЯСНЯЕТ ПЛАН Выберите имя, ID ИЗ ТЕСТ ГРУППЫ (ФИО, ИД);

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

1

Причина, по которой все запросы дают одинаковые результаты, состоит в том, что таблица имеет уникальные значения.

Использование «group by» в этом случае бессмысленно. Используйте «group by», когда вы хотите подсчитать или суммировать (или другие математические операции). Вот такой пример:

select name, count(*) ct from test group by name 

Это будет показано имя и сколько раз имя отображается в таблице.

Относительно порядка выхода: Oracle вернет строки в случайном порядке до тех пор, пока не будет проинструктирован. Таким образом, чтобы задать определенный порядок, а затем использовать «заказ» статьи как:

select name,id from test order by name, id; 

Тогда вы гарантированно, что результаты будут возвращены сортируются по имени. И если имя появляется более одного раза, они будут иметь порядок по id.

1

Как в oracle Я могу найти заказ, в котором выполняется запрос выше? Его случайный для каждого данных? Или есть способ, которым он будет выполняться для всех наборов данных.

В SQL, порядок, в котором определяются строки являются неопределенными, если вы попросите один явно используя order by положение. (Если нет, то вы получите строки в том порядке, в котором они нашли, чтобы соответствовать вашему запросу, и которые они будут зависеть от плана запроса.)

[на запросы] получени же мощность.

Это потому, что у вас есть идентификатор. Предположительно, они все различны и обозначены как первичный ключ в вашей реальной схеме.

distinct, btw, является group by всеми полученными полями для всех целей и задач.

В любом случае, если вы хотите, чтобы строки были последовательно, вы хотите что-то вроде order by name, id.

1

Посмотрите на свой скрипт SQL: у вас есть пять записей в таблице, с пятью комбинациями NAME и ID. Таким образом, ваши запросы будут возвращать все строки. Фактически они такие же, как этот запрос ...

select name, id from test; 

... только с дополнительным потреблением ресурсов для безрезультатным рода база данных обязуется обеспечить уникальность. Добавление новой записи, которая дублирует NAME и ID, но имеет другую EMAIL, поможет вам понять, что происходит.

Вы должны понимать, что использование DISTINCT на самом деле довольно редко в реальной жизни: для создания уникального набора результатов должно быть достаточно правильно определено предложение WHERE. GROUP BY обычно используется с агрегирующей функцией, такой как COUNT() или SUM(); например, сколько идентификаторов NAME + имеют более одной EMAIL?

select name, id from test 
group by name, id having count(*) > 1; 

Что касается заказа, ваши выполненные запросы требуют разного рода, так что порядок набора результатов может отличаться от порядка ввода. Oracle в любом случае не гарантирует порядок своих результирующих наборов, но сортировка делает его еще менее предсказуемым. Для того, чтобы получить эту гарантию необходимо указать ORDER BY пункте:

select distinct name, id from test 
order by name, id 

Это ORDER BY п гарантирует одинаковый порядок для любого заявления, независимо от того, что происходит другая обработка при фильтрации и обработки результирующего набора.