DBI can (somewhat) page data, but of course you can only page forward. The following code fetches the results in batches of 10k rows:
my $rows = ; # cache for batches of rows
while( my $row = ( shift(@$rows) || # get row from cache, or reload
# do processing of row here ...
Of course, just because you're transferring the data from the DB driver to Perl space in batches of 10k doesn't mean that the database driver doesn't fetch all available rows onto your machine already.
Data::Stream::Bulk wraps this approach in an(other) API, but I never got warm with it.