Skip to content

Instantly share code, notes, and snippets.

@michail-nikolaev
Last active January 30, 2018 23:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save michail-nikolaev/b7cbe1d6f463788407ebcaec8917d1e0 to your computer and use it in GitHub Desktop.
Save michail-nikolaev/b7cbe1d6f463788407ebcaec8917d1e0 to your computer and use it in GitHub Desktop.
CREATE TABLE ticket AS
SELECT
id,
TRUNC(RANDOM() * 100 + 1) AS project_id,
NOW() + (RANDOM() * (NOW()+'365 days' - NOW())) AS created_date,
repeat((TRUNC(RANDOM() * 100 + 1)::text), 1000) as payload
FROM GENERATE_SERIES(1, 1000000) AS g(id);
CREATE INDEX simple_index ON ticket using btree(project_id, created_date);
VACUUM FULL;
VACUUM ANALYZE ticket;
SET work_mem = '512MB';
SET random_page_cost = 1.0;
EXPLAIN ANALYZE
with r as (
select TRUNC(RANDOM() * 100 + 1) as id
)
SELECT * FROM ticket
WHERE project_id = (select id from r)
AND created_date > '20.06.2017'
ORDER BY created_date offset XXXXX limit 100;
-- offset 100 1.3ms vs 0.7ms
-- offset 1000 5.6ms vs 1.1ms
-- offset 10000 46.7ms vs 3.6ms
@michail-nikolaev
Copy link
Author

michail-nikolaev commented Jan 30, 2018

Also, works for such queries:

EXPLAIN ANALYZE
WITH _id AS (
    SELECT 
    TRUNC(RANDOM() * 100 + 1) 
    AS id
)
select * from 
(
	select * from ticket where project_id = (SELECT id FROM _id)
) as x
limit 100 offset 9000

@michail-nikolaev
Copy link
Author

But not for such:

EXPLAIN ANALYZE
WITH _id AS (
    SELECT 
    TRUNC(RANDOM() * 100 + 1) 
    AS id
)
select * from 
(
	select * from ticket where project_id = (SELECT id FROM _id)
) as x
where project_id / 2 != 100
limit 100 offset 9000

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment