ランダムに一つのROWをとってくる

package App::Schema::Table::Hoge;
use strict;
use warnings;
use base qw/DBIx::Class::ResultSet/;

sub get_random_row {
    my ($self) = @_;
    
    my @ids = $self->search(
        {},
        {
            select => [ qw/ id / ],
        }
    )->get_column('id')->all;

    my $id = $ids[ int( rand( scalar @ids ) ) ];
    
    $self->find($id);
}

1;

こんな感じかなあ。

SELECT * FROM hoge ORDER BY rand() LIMIT 1;

になるよりかましだと思ったんだけど、ちゃんとベンチマークしてないので信憑性ないですー。