Почему Oracle возвращает определенную последовательность, если значения 'orderby' идентичны? - PullRequest
7 голосов
/ 11 октября 2010

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

SELECT
  Date,
  Amount
FROM MyTable
WHERE Date = '26-OCT-2010'
ORDER BY Date

Возвращает следующие данные:

   |  Date       |  Amount
--------------------------
1  |  26-OCT-10  |  85
2  |  26-OCT-10  |  9
3  |  26-OCT-10  |  100

Я не могу понять, почему база данных возвращает данные в этом конкретном порядке или почему, поскольку исходная таблица будет возвращать данные таким образом.

Приведение Date к TIMESTAMP подтверждает, что все значения Date являются одним и тем же значением - 26-OCT-10 00.00.00.000000000, поэтому я могу исключить, что есть различия в значениях Однако, когда я делаю это, строки возвращаются в порядке 1, 3, 2.

Это сводит меня с ума, так что это действительно помогло бы мне успокоить, если бы кто-то мог объяснить, почему это так.

Я ожидал бы, что это будет возвращаться в другом порядке при каждом выполнении запроса, учитывая, что условный порядок одинаков для каждой строки (таким образом, упорядочение остается чистым).

Большое спасибо заранее.

Ответы [ 4 ]

10 голосов
/ 11 октября 2010

Порядок не сводится к "чистой случайности" - если вы не измените запрос на:

SELECT
  Date,
  Amount
FROM MyTable
WHERE Date = '26-OCT-2010'
ORDER BY Date, DBMS_RANDOM.VALUE;

Порядок "произвольный". Вместо того чтобы «бросать кубики», чтобы решить произвольный порядок (что повлечет за собой некоторые ненужные затраты), Oracle просто возвращает данные в том порядке, в котором они их встретили - что, скорее всего, будет таким же от запуска к запуску в краткосрочной перспективе. (В долгосрочной перспективе в окружающей среде что-то может измениться, чтобы порядок был другим - но все же произвольным).

2 голосов
/ 11 октября 2010

Прочитайте этот замечательный кусок из блога Тома Кайта о заказе.

Когда вы говорите, что строки возвращаются в порядке "1,3,2", вам следует упорядочить столбцы, в которых указано, что для исправления необходимо 1,3,2.

2 голосов
/ 11 октября 2010

Хотя я ничего не знаю о реализации Oracle, если все вещи равны, в приоритетном порядке, то они не будут в случайном порядке: для их размещения в случайном порядке потребуется случайный порядок в каждом случае, (что было бы n рандомизированных операций, где n - количество элементов (с использованием большой записи O это будет O (n)), что является вычислительно дорогой вещью, если запрос выдаст огромные (миллионы) результатов.

Возвращено по запросу

нет необходимости их рандомизировать таким образом,

вместо этого он просто возвращает их (как я предполагаю) в порядке, в котором они хранятся на диске

0 голосов
/ 11 октября 2010

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

...