2016-12-25 3 views
0

Я хотел бы получить случайный набор из 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() 

я сделал игнорировать смещение части, так как она Безразлично» Мне важно, если два вызова дают мне те же результаты, мне просто нужен случайный набор строк.

+0

это помогает? https://stackoverflow.com/questions/60805/getting-random-row-through-sqlalchemy#60815 –

+0

yep Я видел это, но на самом деле это не затрагивает проблему избежания подсчета строк ... если это возможно на всех ... – carl

+0

привет hiro ... извините, но в чем отличие этого предложения от моего первого подхода? – carl

ответ

1

Я оптимизировал это раньше, добавив индексный столбец r, который автоматически добавляет случайное значение при создании строки. Тогда, когда вам нужен случайный набор строк, просто SELECT * FROM table ORDER BY r LIMIT 10 OFFSET some_random_value. Вы можете запустить скрипт, который обновляет вашу схему, чтобы добавить этот столбец в существующие строки. Вы добавите небольшое количество хитов для работы с этим подходом, но если это функциональность, которая вам нужна настойчиво, это должен быть справедливый компромисс.

+0

привет mVChr ... спасибо за ответ ... Я бы подумал, что order_by должен смотреть на все строки? – carl

+0

только для обновления моего предыдущего комментария ... Я реализовал его, и он не быстрее моих предыдущих решений ... Я добавил свою точную реализацию выше – carl

+0

извинения, ваш подход быстрее ... Оказалось, что шаги фильтра в моем позвоните, где причина не ускорилась ... Я приму ваш ответ – carl

Смежные вопросы