powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка по RAND()
25 сообщений из 67, страница 2 из 3
Сортировка по 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
25 сообщений из 67, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка по RAND()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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