Repository navigation
Expand file tree
/
Copy pathdatabase_setup.sql
More file actions
152 lines (136 loc) · 3.63 KB
/
Copy pathdatabase_setup.sql
File metadata and controls
152 lines (136 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
------ Prepare schema -------
SHOW timezone;
SET timezone = 'UTC';
ALTER SYSTEM SET timezone='UTC';
DELETE FROM jobs;
DROP TABLE IF EXISTS jobs;
CREATE TABLE jobs (
id SERIAL PRIMARY KEY,
topic VARCHAR(1000) NOT NULL,
payload VARCHAR(5000) NOT NULL,
fire_at TIMESTAMPTZ NOT NULL,
processed BOOLEAN NOT NULL,
processed_at TIMESTAMPTZ NULL
);
CREATE INDEX ix_jobs_fire_at ON jobs (fire_at);
CREATE INDEX ix_jobs_processed_fire_at ON jobs (processed, fire_at);
CREATE INDEX ix_jobs_processed_fire_at_id ON jobs (processed, fire_at, id) INCLUDE (topic, payload);
------ Add test data -------
INSERT INTO jobs (
topic,
payload,
fire_at,
processed,
processed_at
) VALUES (
'job/test/topic',
'{"Job": "TestValue"}',
now(),
false,
null
);
-- Bulk add
INSERT INTO jobs (
topic,
payload,
fire_at,
processed,
processed_at
) values
('job/test/topic', '{"Job": "TestValue5"}', now(), false, null),
('job/test/topic', '{"Job": "TestValue6"}', now(), false, null),
('job/test/topic', '{"Job": "TestValue4"}', now() + INTERVAL '1 second', false, null),
('job/test/topic', '{"Job": "TestValue3"}', now() + INTERVAL '2 second', false, null),
('job/test/topic', '{"Job": "TestValue2"}', now() + INTERVAL '4 second', false, null),
('job/test/topic', '{"Job": "TestValue1"}', now() + INTERVAL '3 second', false, null),
('job/test/topic', '{"Job": "7"}', now() + INTERVAL '7 second', false, null);
-- Bulk add for stress test
INSERT INTO jobs (
topic,
payload,
fire_at,
processed,
processed_at
)
SELECT
'job/test/topic',
'{"Job": "' || x.test_data || '"}',
now(),
false,
null
FROM generate_series(1, 20000) AS x(test_data);
-- Bulk add for stress test with delay
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT generate_series(1, 10000) AS test_data
LOOP
INSERT INTO jobs (topic, payload, fire_at, processed, processed_at)
VALUES ('job/test/topic', '{"Job": "' || r.test_data || '"}', now(), false, null);
PERFORM pg_sleep(.1); -- Delay of 1 second
END LOOP;
END $$;
------ Read test data -------
SELECT COUNT(*) FROM jobs;
SELECT COUNT(*) FROM jobs WHERE processed = false;
SELECT * FROM jobs;
SELECT * FROM jobs ORDER BY fire_at ASC;
SELECT * FROM jobs ORDER BY id;
SELECT
id,
topic,
payload,
fire_at,
fire_at AT TIME ZONE 'UTC' AS fire_at_utc,
processed,
processed_at,
processed_at AT TIME ZONE 'UTC' AS processed_at_utc
FROM jobs;
------ Run program logic selector -------
SELECT id
FROM jobs
WHERE processed = false
AND fire_at AT TIME ZONE 'UTC' > now() AT TIME ZONE 'UTC' - INTERVAL '10 min'
AND fire_at AT TIME ZONE 'UTC' < now() AT TIME ZONE 'UTC' + INTERVAL '10 min'
ORDER BY fire_at ASC
LIMIT 10;
------ Run partitioned program logic selector -------
-- All
SELECT id
FROM jobs
WHERE processed = false
AND fire_at AT TIME ZONE 'UTC' > now() AT TIME ZONE 'UTC' - INTERVAL '10 min'
AND fire_at AT TIME ZONE 'UTC' < now() AT TIME ZONE 'UTC' + INTERVAL '10 min'
AND id % 1 = 0
ORDER BY fire_at ASC
LIMIT 10;
-- 3 consumers
SELECT id
FROM jobs
WHERE processed = false
AND fire_at AT TIME ZONE 'UTC' > now() AT TIME ZONE 'UTC' - INTERVAL '10 min'
AND fire_at AT TIME ZONE 'UTC' < now() AT TIME ZONE 'UTC' + INTERVAL '10 min'
AND id % 3 = 0
-- AND id % 3 = 1
-- AND id % 3 = 2
ORDER BY fire_at ASC
LIMIT 10;
------ Run program logic update -------
UPDATE jobs
SET processed = true,
processed_at = now()
WHERE id IN (SELECT id
FROM jobs
WHERE processed = false
AND fire_at AT TIME ZONE 'UTC' > '2024-01-22 01:30:56.505 +00:00'
AND fire_at AT TIME ZONE 'UTC' < '2024-01-22 01:54:56.505 +00:00'
ORDER BY fire_at ASC
LIMIT 10
)
RETURNING id,
topic,
payload,
fire_at,
processed,
processed_at;