Устойчива ли сортировка Oracle ORDER BY? - PullRequest
1 голос
/ 02 ноября 2019

Версия Oracle - Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production Вставлено 10000 записей с тем же значением имени, затем порядок по имени, pageSize равен 1000 и в итоге может успешно получить 10000 идентификаторов. Таким образом, кажется, что вид стабильный.

Вставка sql:

@Insert("insert into org_info(isvalid, update_time, org_uni_code,ORG_CHI_NAME) values(#{isvalid}, TO_TIMESTAMP(#{updateTimeStr}, 'yyyy-mm-dd hh24:mi:ss.ff'), #{orgUniCode},#{name})")
void insertOrgInfo(int isvalid, String updateTimeStr, Long orgUniCode, String name);

Запрос sql:

@Select("select org_uni_code from (" +
        " select org_uni_code, rownum rn from(" +
        " select org_uni_code from org_info where update_time >= TO_TIMESTAMP(#{updateTimeStr}, 'yyyy-mm-dd hh24:mi:ss.ff') order by ORG_CHI_NAME" +
        " )" +
        " ) where rn > #{start} and rn<=#{end}")
List<Long> pagingGetOrgUniCodeList(String updateTimeStr, int start, int end);

1 Ответ

1 голос
/ 02 ноября 2019

Сортировка базы данных Oracle нестабильна;способ вставки данных не имеет гарантированного отношения к способу возврата данных.

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

Много раз, когда Oracle сортирует выглядит стабильным, но легко создавать тестовые примеры, демонстрирующие нестабильную сортировку. Если нам нужно гарантированное поведение сортировки, мы должны полностью указать выражения в предложении ORDER BY.

Например, в приведенном ниже тривиальном тестовом примере вставлены значения для столбца B в порядке 1, 2, 3. Нопри сортировке по A он возвращал значения B в порядке 1,3,2.

--drop table table1;
create table table1(a number, b number);
insert into table1 select 1,1 from dual;
insert into table1 select 1,2 from dual;
insert into table1 select 1,3 from dual;

select * from table1 order by a;

A   B
-   -
1   1
1   3
1   2

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

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