Я хотел бы получить случайный набор из X записей из моей базы данных postgres, используя sqlalchemy. Мой первый подход был этотПолучение случайного набора записей базы данных
random_set_of_Xrows = models.Table.query.filter(something).order_by(func.random()).limit(len(X)).all()
, так как моя таблица достаточно большая, эта команда занимает около 1 секунды, и мне было интересно, как оптимизировать его. Я предполагаю, что функция order_by требует просмотра всех строк, поэтому я полагал, что использование offset вместо этого может ускорить работу. Однако, я не могу понять, как избежать подсчета строк целиком? Вот подход с использованием смещения
rowCount = db.session.query(func.count(models.Table.id)).filter(something).scalar()
random_set_of_Xrows = models.Table.query.offset(func.floor(func.random()*rowCount)).limit(len(X)).all()
который, однако, не быстрее, причем большая часть времени, затрачиваемого на получение сверку. Любые идеи, как сделать это быстрее? веселит Carl
EDIT: Как было предложено ниже я добавил столбец таблицы со случайным значением и используют его для извлечения строк, как
random_set_of_Xrows = models.Table.query.filter(something).order_by(models.Table.random_value).limit(len(X)).all()
я сделал игнорировать смещение части, так как она Безразлично» Мне важно, если два вызова дают мне те же результаты, мне просто нужен случайный набор строк.
это помогает? https://stackoverflow.com/questions/60805/getting-random-row-through-sqlalchemy#60815 –
yep Я видел это, но на самом деле это не затрагивает проблему избежания подсчета строк ... если это возможно на всех ... – carl
привет hiro ... извините, но в чем отличие этого предложения от моего первого подхода? – carl