powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка по RAND()
67 сообщений из 67, показаны все 3 страниц
Сортировка по RAND()
    #39632094
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Server Version: WI-V3.0.0.32483 Firebird 3.0

SELECT FIRST 20 a.ID, DS.RND
FROM (select FIRST 100
a.id, rand() as RND from articles a order by ID desc) AS DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND

Делаем сортировку по значению RAND() из внутреннего подзапроса. В колонке RND в плане сортировки полная каша...
В чем смысл - из 100 последних фотографий (по ID) делаем выборку 20 случайных.
Вроде как результат по сути получается, 20 последних фоток вроде как хаотично выбираются, но что с сортировкой по RND? Там ведь явно значение из подзапроса указано, или RAND() повторно срабатывает?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632127
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryили RAND() повторно срабатывает?

Да. Не нравится - материализуй резалт-сет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632176
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа. Не нравится - материализуй резалт-сет.

А в чем великий смысл повторного RAND() во внешней обертке? Я интерпретирую это как глюк. Мы же получили значения во внутреннем запросе и извне используем значение поля.
В данном контексте использования результат в принципе устраивает, но у любого будут вопросы - а то ли это на самом деле.
Что значит "материализуй резалт-сет"?
Если внутренний подзапрос будет спрятан во view или процедуре - живое поле тоже будет извне жить своей жизнью?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632183
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry> А в чем великий смысл повторного RAND() во внешней обертке? Я интерпретирую это как глюк.

Это не глюк и глубокого смысла/замысла в нём нет, просто
такова реализация. IIRC, это даже задокументировано.

P.S. Кроме того, IIRC вызовов может быть даже 3, а не 2.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632190
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,
Странно конечно... кому это в голову пришла такая реализация :)
Хотя я получил подтверждение что это все таки рандомная выборка/сортировка. Но предсказуемая не так, как бы подумалось. С двойной непредсказуемостью.... или я еще что-то упустил...
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632191
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

в процедуре точно не будет.

Материализовать результат в запросе можно как то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH T
AS (SELECT
        a.ID
    FROM
        articles a
    ORDER BY A.ID DESC
    FETCH FIRST 100 ROWS ONLY)
SELECT
    a.ID, DS.RND
FROM
    (SELECT
         ID,
         RAND() AS RND,
         -- оконная функция заставляет материализовасться результат
         COUNT(*) OVER() AS N
     FROM
         T) DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND
FETCH FIRST 10 ROWS ONLY
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632195
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты имел ввиду второй вызов ORDER BY DS.RND, а третий SELECT FIRST 20 a.ID, DS.RND.
Ситуация вообще не контролируемая...
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632199
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

по поводу запроса я соврал. Не смотря на то что окно буферизируется, но всё равно столбец перевычисляется.

А вот так работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH DS
AS (SELECT
        a.ID,
        -- вот это материализует точно
        (SELECT RAND() FROM RDB$DATABASE) AS RND 
    FROM
        articles a
    ORDER BY A.ID DESC
    FETCH FIRST 100 ROWS ONLY)
SELECT
    a.ID, DS.RND AS RND1, DS.RND AS RND2
FROM DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND


FETCH FIRST 10 ROWS ONLY
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632211
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

> В чем смысл - из 100 последних фотографий (по ID) делаем выборку 20 случайных.
не стоит напрягать этим сервер
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632228
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

А кого надо напрягать? Сеть, передавая все 100?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632231
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис
Последний твой запрос дает у меня все время одинаковый набор ID с сортировкой по ID. Колонки RND1, RND2 с одним значением.
По твоему запросу получается хвост наименьших ID из последних 100.
В принципе своим первым запросом я решаю поставленную задачу - выборка 20 хаотичных фотографий из последних 100.
Проблема просто в том, что я уже на протяжении ряда лет работы с IB/FB давно не задавал себе вопрос - все ли у меня в порядке с головой. :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632237
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,
> не стоит напрягать этим сервер
Ты эксперт по оценке напряжения серверов?
Берем 100 штук ID по ключу, из низ выдергиваем 20, правда беспорядочно, но такова суть идеи.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632294
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryили я еще что-то упустил...

http://www.ibase.ru/dataaccesspaths/
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632298
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

мда, чёт внимание не обратил. Ну тогда из ХП. А вообще в чём глубокий смысл сохранить значение этого RAND? Главное ведь чтобы значения в случайном порядке выдавались. Есть ли вообще смысл возвращать значение DS.RND?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632303
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Не, смысла особого нет, все равно мы же ведь хаос выбираем.
Задача нормально решается еще моим первым запросом.
Просто немножко странно как оно все это проявляется, если на это смотреть и как оно устроено внутри. :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632308
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто ожидал однократного срабатывания RAND(), лишь в том месте где оно явно указано.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632316
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели и внутренний Gen_ID(...) мне извне кашу выдаст?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632319
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

все вычисляемые поля вычисляются столько раз сколько используются, это касается не только RAND
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632361
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table ExperimentData(
  Id integer not null primary key,
  ExperimentId integer,
  P1 blob,
  P2 blob,
  P3 blob,
  P4 blob
  ...
  P100 blob
);

select LongExecTimeMathFunc(P1, P2, P3, P4, ..., P100) as ResultValue from ExperimentData order by ResultValue

Если в таблице 1000 записей, то функция LongExecTimeMathFunc будет вызвана 2000 раз.

А ещё может быть:
Код: sql
1.
2.
3.
insert into TransferPaymentsLog(PaymentBlockId, PaymentId, FromId, ToId, Amount, TransferResult) 
select (cast(:PaymentBlockId as integer)), PaymentId, FromId, ToId, Amount, TransferPayment(PaymentId, FromId, ToId, Amount) as TransferResult 
from PaymentsToTransfer order by TransferResult


Какой процент разработчиков знает, что TransferPayment будет вызван по два раза на запись? И таким образом может случиться либо по два перевода (и вторые без записи в лог), либо в логе записи будут не отсортированы по TransferResult.

А какой процент разработчиков вспомнит что он это знает?
Вот вы, например, читающий эти строки, вспомните?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632377
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
> все вычисляемые поля вычисляются столько раз сколько используются, это касается не только RAND
Кажется мне нужна перезагрузка... внутренний вызов Gen_ID действительно "живой" извне...
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632378
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerКакой процент разработчиков знает, что TransferPayment будет вызван по два раза на запись?100% получивших пендель за такой код с побочными эффектами
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632385
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerКакой процент разработчиков знает, что TransferPayment будет вызван по два раза на запись?100% получивших пендель за такой код с побочными эффектами
А как он догадается где проблема?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632387
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hommerhvladпропущено...
100% получивших пендель за такой код с побочными эффектами
А как он догадается где проблема?
Дающие пендель подскажут?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632405
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,
Влад, в свое время я поднимал вопрос поводу того, что измененный генератор при откате транзакции не откатывается назад. Меня вроде как убедили, что генератор мол особый объект, живущий вне транзакции. Хотя это тоже определенные данные в БД. Ну ладно... пусть будет так.
Ну а здесь... Я же ведь значения полей беру из внутреннего подзапроса. Ну надо мне повторное срабатывание функции - я явно укажу вызов функции. Я не мог даже предполагать, что оно живое и динамичное.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632406
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

ну ты прям пишешь будто для тебя это открытие. Все уже давно знают, что такую ересь писать нельзя.
Вроде не первый год на форуме
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632421
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Ну select from select не такой уж и старый, в IB и даже наверное первых FB его не было. Я его использую довольно редко.
Ну ладно... уже все понаписывали не так как надо, пока я ситуацию не контролировал. :)
Так как мне погасить повторные вызовы? Только прятать подзапрос в процедуру?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632425
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryhvlad,
Влад, в свое время я поднимал вопрос поводу того, что измененный генератор при откате транзакции не откатывается назад. Меня вроде как убедили, что генератор мол особый объект, живущий вне транзакции. Хотя это тоже определенные данные в БД. Ну ладно... пусть будет так.Это не "ну ладно". Это показывает на твой уровень владения предметом, увы не высокий.

barryНу а здесь... Я же ведь значения полей беру из внутреннего подзапроса. Ну надо мне повторное срабатывание функции - я явно укажу вызов функции. Я не мог даже предполагать, что оно живое и динамичное.В SQL пользователь указывает ЧТО делать, а не КАК делать. Это новость ?

Есть разные стратегии работы с выражениями, можно запоминать результат (это требует доп. памяти), можно вычислять их заново (это требует CPU).
В Interbase 100 лет назад выбрали второй подход и изменить его не так просто, как кому-то хочется.
Это не значит, что так будет всегда. Но пока что - вот так.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632427
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryДегтярев Евгений,

А кого надо напрягать? Сеть, передавая все 100?

раз дергаем 100 и мешаем как угодно, не напрягая ни сеть не сервер )
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632430
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
select 
  Func1(P1, P2, P3, P4, ..., P50), 
  sum(Func2(P51, P52, P53, P54, ..., P100)) 
from ExperimentData 
group by 1

В таблице 1000 записей.
Сколько раз вызовется функция Func1?
Сколько раз вызовется функция Func2?
Как количество вызовов зависит от значений возвращаемых функциями Func1 и Func2?


Код: sql
1.
2.
3.
4.
select 
  Func1(P1, P2, P3, P4, ..., P50), 
  Func1(P1, P2, P3, P4, ..., P50) 
from ExperimentData 

Func1 вызвана 2000 раз, всё ожидаемо, без вывертов движка. Дописываем sum:
Код: sql
1.
2.
3.
4.
select 
  sum(Func1(P1, P2, P3, P4, ..., P50)), 
  sum(Func1(P1, P2, P3, P4, ..., P50)) 
from ExperimentData 

Func1 вызвана 1000 раз. Вот как так?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632443
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerВ таблице 1000 записей.
Сколько раз вызовется функция Func1?
Сколько раз вызовется функция Func2?Почему тебя это интересует ?
Из-за побочных эффектов этих ф-ций ?
Избавься от побочных эффектов. Или перепиши вызывающий код.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632446
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисну ты прям пишешь будто для тебя это открытие. Все уже давно знают, что такую ересь писать нельзя.
Вроде не первый год на форуме
Для меня это не открытие. Хочешь я статью на Хабре напишу и мы узнаем кто знает а кто нет? :)
Я не первый год. Но что мне теперь, несуразности перестать замечать? Или не говорить о них?
Всем же понятно что баги и несуразности не должны утаиваться ни от пользователей ни от самих себя.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632456
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийраз дергаем 100 и мешаем как угодно, не напрягая ни сеть не сервер )В условии не описано, что надо получить 100 фоток утром и весь день 20 случайных из них показывать, время от времени перетасовывая.
И что-то мне подсказывает, что так задача не стоит.
Получение свежих данных в 5 раз эффективнее на сервере.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632459
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerВ таблице 1000 записей.
Сколько раз вызовется функция Func1?
Сколько раз вызовется функция Func2?Почему тебя это интересует ?
Из-за побочных эффектов этих ф-ций ?
Избавься от побочных эффектов. Или перепиши вызывающий код.
Понял что старый код от Intebase, неправильный, менять на правильный не понятно когда, кому и зачем.

А вот это:
Hommer
Код: sql
1.
2.
3.
4.
select 
  Func1(P1, P2, P3, P4, ..., P50), 
  Func1(P1, P2, P3, P4, ..., P50) 
from ExperimentData 

Func1 вызвана 2000 раз
Код: sql
1.
2.
3.
4.
select 
  sum(Func1(P1, P2, P3, P4, ..., P50)), 
  sum(Func1(P1, P2, P3, P4, ..., P50)) 
from ExperimentData 

Func1 вызвана 1000 раз
? Тоже наследие Interbase?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632464
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

давай отличать баги и "неоптимальное" выполнение. Если что-то работает и возвращает правильный результат, то это уже не баг.
А неправильный результат запрос может вернуть только если эти функции недетерминированные или с побочными эффектами (это уже клиника).
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632506
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hommer
Код: sql
1.
2.
3.
4.
5.
select 
  Func1(P1, P2, P3, P4, ..., P50), 
  sum(Func2(P51, P52, P53, P54, ..., P100)) 
from ExperimentData 
group by 1


Подскажете как переписать чтобы вызывалось по одному разу?

Симонов Денис, пусть Func1 и Func2 - функции, которые для расчётов используют MatLab (что очень не быстро) или 10000 процессоров в aws (что ещё и дорого).
И пожалуйста, смотрите на задачу не как на конкретную, а как на пространство возможных.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632530
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerТоже наследие Interbase?За 500$ в час я объясню тебе все эффекты.
Минимум - 3 часа.
Начинаем ?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632532
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисHommer,

давай отличать баги и "неоптимальное" выполнение. Если что-то работает и возвращает правильный результат, то это уже не баг.
А неправильный результат запрос может вернуть только если эти функции недетерминированные или с побочными эффектами (это уже клиника).

Код: sql
1.
2.
3.
insert into TransferPaymentsLog(PaymentBlockId, PaymentId, FromId, ToId, Amount, TransferResult) 
select (cast(:PaymentBlockId as integer)), PaymentId, FromId, ToId, Amount, TransferPayment(PaymentId, FromId, ToId, Amount) as TransferResult 
from PaymentsToTransfer order by TransferResult


TransferPayment возвращает True если отработала успешно и False если не успешно, т.е:
TransferPayment(100, 1, 2, 1000000) вернёт True, а следующий такой же
TransferPayment(100, 1, 2, 1000000) вернёт False, т.к. это попытка провести уже проведённое.
Это простой и понятный пример недетерминированной функции: деньги уже заплачены, второй раз платить нельзя.

Далее: в PaymentsToTransfer 1000 записей.
Вас удивит, если обнаружите что после окончания работы этого sql в TransferPaymentsLog появятся 1000 записей с TransferResult = False, хотя все платежи были успешно проведены?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632539
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

недетерминированные функции - они такие. Особенно прикалывает, как по таким функциям пытаются индекс строить.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632547
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

Ну написал же Влад
hvlad Есть разные стратегии работы с выражениями, можно запоминать результат (это требует доп. памяти), можно вычислять их заново (это требует CPU).
В Interbase 100 лет назад выбрали второй подход и изменить его не так просто, как кому-то хочется.
Это не значит, что так будет всегда. Но пока что - вот так.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632551
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerТоже наследие Interbase?За 500$ в час я объясню тебе все эффекты.
Минимум - 3 часа.
Начинаем ?
Я за слушать отговорки беру $1000 в час :)
Но если там будет про то почему за 18 лет с начала вашего первого срока так и не получилось побороть коррупцию и слезть с нефтяной иглы сделать хорошо, то скину половину :)
Начинаем? :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632571
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.04.2018 12:41, barry пишет:
> в свое время я поднимал вопрос поводу того, что измененный генератор при откате транзакции не откатывается назад.

СЕГОДНЯ ПРОСТО ПРАЗДНИК КАКОЙ-ТО!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632572
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerTransferPayment возвращает True если отработала успешно и False если не успешно, т.е:
TransferPayment(100, 1, 2, 1000000) вернёт True, а следующий такой же
TransferPayment(100, 1, 2, 1000000) вернёт False, т.к. это попытка провести уже проведённое.
Это простой и понятный пример недетерминированной функции: деньги уже заплачены, второй раз платить нельзя.

если проектировщик ССЗБ, то да. Сколько раз повторять ни селективные процедуры, ни PSQL функции не должны внутри себя что-то модифицировать. По крайней мере если они используются в SELECT запросе, да ещё с JOIN к другим таблицам. Как говорится пути оптимизатора неисповедимы. То что работает в одном порядке сейчас завтра может начать работать совсем иначе.


Да Firebird это позволяет, но надо же ещё здравый смысл включать.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632591
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

вот тебе контр пример. В таблице T содержится 100000000 записей. Делаем вот такой простой запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM (
  SELECT 
    GEN_ID(MyGen, 1) as GenValue,
    ID
  FROM T)
WHERE ID = 1



Внимание вопрос сколько раз должен дёрнутся генератор? Тут ведь кто-то жаждил материализовать результат выражений. На самом деле это можно делать, но далеко не всегда.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632615
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

я всё таки решил твою задачу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
WITH T
AS (SELECT
        a.id as ID, 
        rand() as RND 
    FROM articles a 
    ORDER BY a.id DESC
    FETCH FIRST 100 ROWS ONLY),
DS
AS (SELECT
        ID,
        RND
    FROM
        T
    UNION ALL -- вот здесь всё волшебство
    SELECT
        NULL,
        NULL
    FROM
        RDB$DATABASE
    WHERE FALSE)
SELECT
    a.ID,
    DS.RND as R1,
    DS.RND as R2
FROM
    DS
JOIN articles a ON a.ID=DS.ID
ORDER BY DS.RND
FETCH FIRST 10 ROWS ONLY
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632650
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,
> СЕГОДНЯ ПРОСТО ПРАЗДНИК КАКОЙ-ТО!
А почему бы не праздник, кто еще может устроить настоящий праздник? :)
Я так интерпретирую транзакцию. Попробуй мне доказать обратное. Даже если генератор рассматривать без привязки к таблице (к полю ID). А просто как некую внутреннюю переменную. Это данные базы данных. Такое же, как и содержимое таблиц, просто неструктурированное. Почему на него не должны воздействовать правила транзакции?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632653
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Спасибо Денис! Занятие достойное уважающих себя мужчин.
Весь вопрос ведь в том - почему нужно извращаться пол-дня чтобы получить очевидное решение.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632660
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.04.2018 16:25, barry пишет:
> Я так интерпретирую транзакцию. Попробуй мне доказать обратное

ты не обижайся, но пашол ты на
(в хорошем смысле, конечно)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632667
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

генераторы есть стандарте и называются там последовательностями. Можешь почитать там о том как они должны работать. В Interbase генераторы придуманы задолго до появления их в стандарте. И их поведение сделано таковым чтобы обеспечить уникальные суррогатные ПК. Во всех СУБД где есть последовательности они ведут себя аналогично Firebird. Сам подумай что будет при конкурентом доступе с ключами, если бы генераторы вели себя так как ты хочешь.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632678
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисHommer,

вот тебе контр пример. В таблице T содержится 100000000 записей. Делаем вот такой простой запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM (
  SELECT 
    GEN_ID(MyGen, 1) as GenValue,
    ID
  FROM T)
WHERE ID = 1



Внимание вопрос сколько раз должен дёрнутся генератор?

Мне, как пользователю, важно чтобы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET GENERATOR G TO 0;

SELECT *
FROM (
  SELECT 
    GEN_ID(G, 1) as GenValue,
    ID
  FROM Test)
WHERE mod(GenValue, 2) = 0

не возвращало: "3, 5, 7, 9, 11" вместо положенных "2, 4, 6, 8, 10"
Довольно необычно увидеть такое, согласитесь.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632686
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,
Я могу ходить где угодно и сколько угодно и даже понимать инерцию наследования кода от IB, сам писатель.
Но от этого народ не перестанет набивать шишки на побочных эффектах от функций.
Можем закрывать тему, я свой ответ получил.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632687
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HommerМне, как пользователю, важно чтобы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET GENERATOR G TO 0;

SELECT *
FROM (
  SELECT 
    GEN_ID(G, 1) as GenValue,
    ID
  FROM Test)
WHERE mod(GenValue, 2) = 0

не возвращало: "3, 5, 7, 9, 11" вместо положенных "2, 4, 6, 8, 10"
Довольно необычно увидеть такое, согласитесь.
И в связи с этим, как переписать
Код: sql
1.
select F1(P1), sum(F2(P2)) from T group by 1

чтобы F1 и F2 вызывались только по одному разу на каждую запись из T?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632688
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

ты от вопроса то не уходи. Там не всё так очевидно как ты думаешь, потому что во многих случаях предикаты пробрасываются внутрь Derived Table и это хорошо
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632692
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисHommer,

ты от вопроса то не уходи. Там не всё так очевидно как ты думаешь, потому что во многих случаях предикаты пробрасываются внутрь Derived Table и это хорошо
Я понял что там не очевидно. Оба варианта хороши при своих условиях. Причём в каких-то случаях правильно дать это на откуп оптимизатору, а в каких-то нужно иметь возможность сказать чтобы выполнилось как есть.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632696
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hommer,

а вы про вопрос с группировкой что думаете? Он решаемый?
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632706
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

Тебе workaround придумать ли ты хочешь чтобы оптимизатор сам догадался. По поводу второго это не ко мне.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632738
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисТебе workaround придумать ли ты хочешь чтобы оптимизатор сам догадался.
workaround. И не мне, а всем.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632743
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

точно такая плюха через UNION ALL (кстати еле вспомнил про неё, помниться Таблоид где-то с этим извращался). Сам попробуй
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632744
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommerworkaround. И не мне, а всем.

Запомнить, что любое выражение в запросе может вычисляться непредсказуемое число раз и не
использовать недетерминированные функции где попало.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632746
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритмическая хрень должна писаться в процедуре алгоритмически.
Запрос же - описание, что бы хотелось получить, без описания алгоритма.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632761
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HommerИ в связи с этим, как переписать
Код: sql
1.
select F1(P1), sum(F2(P2)) from T group by 1

чтобы F1 и F2 вызывались только по одному разу на каждую запись из T?
Так и не получается сделать одним запросом.
Такое тоже вызывает по нескольку раз:
Код: sql
1.
2.
with TT as (select F1(P1) FF1, F2(P1) FF2 from T)
select FF1, sum(FF2) from TT group by 1



Единственное пока что точно работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
execute block returns (FF1 bigint, FF2 bigint) as

  declare procedure TT returns (F1 bigint, F2 bigint) as
  begin
    for select F1(P1), F2(P2) from test into F1, F2 do
      suspend;
  end

begin
  for select F1, sum(F2) from TT group by 1 into :FF1, :FF2 do
    suspend;
end;
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632789
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryДегтярев Евгенийраз дергаем 100 и мешаем как угодно, не напрягая ни сеть не сервер )В условии не описано, что надо получить 100 фоток утром и весь день 20 случайных из них показывать, время от времени перетасовывая.
И что-то мне подсказывает, что так задача не стоит.
Получение свежих данных в 5 раз эффективнее на сервере.
ситуации разные бывают, одно дело если надо раз в минуту, другое если сотню другую в секунду
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632812
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

т.е. мой пример с unuin all ты не смотрел

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with TT as (
  select 
     F1(P1) as FF1, 
     F2(P1) as FF2 
  from T
  union all
  select null, null from rdb$database where false
)
select FF1, sum(FF2) 
from TT 
group by 1
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632816
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

работает :)
В доку не стыдно будет добавить этот workaround? :) Или правильней "не стрёмно?" :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632861
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry> Даже если генератор рассматривать без привязки к таблице (к полю ID).
barry> А просто как некую внутреннюю переменную. Это данные базы данных.
barry> Такое же, как и содержимое таблиц, просто неструктурированное.

Да, Боря сегодня в ударе. Давно, видимо, шашку в руки не брал, заржавела уже. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632885
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryМимопроходящий,
> СЕГОДНЯ ПРОСТО ПРАЗДНИК КАКОЙ-ТО!
А почему бы не праздник, кто еще может устроить настоящий праздник? :)
Я так интерпретирую транзакцию. Попробуй мне доказать обратное. Даже если генератор рассматривать без привязки к таблице (к полю ID). А просто как некую внутреннюю переменную. Это данные базы данных. Такое же, как и содержимое таблиц, просто неструктурированное. Почему на него не должны воздействовать правила транзакции?

Хочется устроить очередь за ID? Чтобы следующий мог его получить только когда предыдущий закоммитится/отроллбачится? Так флаг тебе в руки, сделай табличку и раздавай из неё таким манером. А кому быстро нужны синтетические ключи и пофиг сколько их ушло в помойку поскольку раздумали использовать, будут пользоваться внетранзакционными генераторами.
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39632893
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка,
> Хочется устроить очередь за ID?
Не надо отвлекаться от темы, генераторы проехали когда еще Абрамсы на IB бегали. Провокация никогда не помешает для поднятия настроения. :)
...
Рейтинг: 0 / 0
Сортировка по RAND()
    #39633020
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это из серии "небольшой утренний бан успокаивает модератора и настраивает на добродушный лад"
...
Рейтинг: 0 / 0
67 сообщений из 67, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка по RAND()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]