CREATE TABLE mytable (id serial PRIMARY KEY); CREATE OR REPLACE FUNCTION get_random_value_with_seed(int, int) RETURNS double precision AS $$ DECLARE result double precision; BEGIN PERFORM setseed(($2/200.0) + ($1 / 429490.0)); SELECT RANDOM() INTO result; RAISE NOTICE 'seeded random value: %', result; RETURN result; END $$ LANGUAGE plpgsql IMMUTABLE; \copy mytable FROM 'file_containing_ints'; CREATE INDEX seeded_random_1 ON mytable (get_random_value_with_seed(id, 1)); SELECT id FROM mytable ORDER BY get_random_value_with_seed(id, 1) LIMIT 5; EXPLAIN ANALYZE VERBOSE SELECT id FROM mytable ORDER BY get_random_value_with_seed(id, 1) LIMIT 5;