Поведение запроса
Sep. 3rd, 2010 08:39 amНарод, а гляньте в разных СУБД, что покажет такой запрос?
select rand() as a from some_table order by a
Т.е. рандом выбранный из таблицы с несколькими полями и сортировкой по этому же полю. В Firebird, судя по результатам, оно два раза считает рандом - один раз для показа, второй для сортировки.
PS: Firebird не сортирует даже такое:
select * from (select rand() as a from some_table) order by a
Ленивые вычисления без мемоизации и проверки на побочные эффекты у них там что ле.
select rand() as a from some_table order by a
Т.е. рандом выбранный из таблицы с несколькими полями и сортировкой по этому же полю. В Firebird, судя по результатам, оно два раза считает рандом - один раз для показа, второй для сортировки.
PS: Firebird не сортирует даже такое:
select * from (select rand() as a from some_table) order by a
Ленивые вычисления без мемоизации и проверки на побочные эффекты у них там что ле.
no subject
Date: 2010-09-03 08:48 am (UTC)no subject
Date: 2010-09-03 08:51 am (UTC)0.0192578518942537
0.2605017761332
0.945262504690571
MySQL
no subject
Date: 2010-09-03 08:52 am (UTC)no subject
Date: 2010-09-03 08:54 am (UTC)no subject
Date: 2010-09-03 08:53 am (UTC)-1681682900
-1570261554
448989160
888323830
902538527
1006354456
1546290389
no subject
Date: 2010-09-03 08:55 am (UTC)no subject
Date: 2010-09-03 08:56 am (UTC)no subject
Date: 2010-09-03 08:58 am (UTC)no subject
Date: 2010-09-03 08:57 am (UTC)select random() as a from generate_series(1,10) order by a
сортировано
Оракл
select dbms_random.value from all_objects where rownum<10 order by dbms_random.value
сортировано
no subject
Date: 2010-09-03 09:01 am (UTC)no subject
Date: 2010-09-03 09:02 am (UTC)Вы order by 1 покажите, кстати.
no subject
Date: 2010-09-03 09:04 am (UTC)И вдогонку
Date: 2010-09-03 09:03 am (UTC)Re: И вдогонку
Date: 2010-09-03 09:04 am (UTC)Re: И вдогонку
Date: 2010-09-03 09:14 am (UTC)постгрес
select random() as a from generate_series(1,10) order by random()*1
тоже не сортирует.
no subject
Date: 2010-09-03 09:05 am (UTC)0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
0.428764130499554
Oracle
0.0340502316890291520609274798136731095
0.06966350796121921730751139575552875007
0.17747052266147076347678040999937326222
0.49795768228249410394342364833528708444
0.60710830867856256337963017053010671276
0.85658177766850710468589586440907014732
0.93991548869458585047818002155989260127
0.97454067210107331088487610807397372431
no subject
Date: 2010-09-03 09:06 am (UTC)no subject
Date: 2010-09-03 09:36 am (UTC)no subject
Date: 2010-09-03 03:47 pm (UTC)no subject
Date: 2010-09-03 04:49 pm (UTC)Если нужна рандомная сортировка, то как вариант можно использовать newid() - он вызывается по разу на строку. Соответственно, если надо вывести столбец сколько-нибудь читабельного типа, то checksum(newid()), хотя некоторые пуристы морщат от этого носик.
no subject
Date: 2010-09-03 09:16 am (UTC)на запрос
SELECT dbms_random.value as rv FROM
ORDER BY rv
SQuirrel (под убунту) выдает
java.lang.NoClassDefFoundError: net/sourceforge/squirrel_sql/fw/datasetviewer/TableState
Position: 0
SQL Developer отрабатывает нормально
ЗЫ. Все бросил и побежал репортить баг. Ога.
no subject
Date: 2010-09-03 09:19 am (UTC)no subject
Date: 2010-09-03 09:21 am (UTC)no subject
Date: 2010-09-03 09:23 am (UTC)TOra,
SQL Developer,
SQuirrel
%-)
И это, считай, я по большому счету не работаю. Так, по верхам SQL\DBA.
no subject
Date: 2010-09-03 09:26 am (UTC)А скрипты консольным тулом запускаю.
Жаба же
Date: 2010-09-03 10:39 am (UTC)no subject
Date: 2010-09-03 10:44 am (UTC)-2115078253
-745643079
-448782669
-203839498
-72273143
1606308000
no subject
Date: 2010-09-03 12:52 pm (UTC)0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
0,744765434690354
no subject
Date: 2010-09-03 07:59 pm (UTC)Если это не так - то это баг оптимизатора
no subject
Date: 2010-09-03 08:03 pm (UTC)select some_expr() from table вызывается на каждую строчку заново.
Но если выражение не зависит от колонок table - то СУБД имеет право произвести оптимизацию - вычислить some_expr() один раз и мемоизировать.
Рассматривать rand() следует НЕзависимым от table. но зависимым от его состояния.
Формально может быть и так и так...
Хороший, темный вопрос неопоределённой семантики
no subject
Date: 2010-09-04 06:01 am (UTC)случайная выборка сформировалась (в отличие от mssql) но не отсортировалась. Сортировки удалось добиться если:
"escapist: работает только если умножить и поделить на одну и ту же колонку" (это лично я не проверял). Закину вопросец на форум поддержки сайбейза, послушаю что ответят.
no subject
Date: 2010-09-04 06:56 am (UTC)no subject
Date: 2010-09-04 04:28 pm (UTC)rand()-как в MS SQL Server
rand2()- Все нормально! И на каждую строчку новое значение, и сортировка работает!!!
no subject
Date: 2010-09-04 08:45 pm (UTC)0.002197332682271798
0.003631702627643666
0.003784295175023652
0.003997924741355632
0.0051576281014435255
0.0053102206488235115
0.007080294198431349
0.007354960783715323
0.008514664143803218
0.009216589861751152
0.00933866389965514
0.00933866389965514
0.009674367503891109
0.010498367259743034
0.011871700186162907
0.01455732902005066
0.015106662190618611
0.015259254737998596
0.016785180211798457
Pervasive 9.5.0077.002