Skip to content

Commit 3eea87f

Browse files
committed
Split into subqueries to use a covering index
1 parent 54db5f2 commit 3eea87f

File tree

1 file changed

+34
-10
lines changed

1 file changed

+34
-10
lines changed

src/main/scala/com.snowplowanalytics.snowplow.micro/SqliteStorage.scala

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,45 @@ private[micro] class SqliteStorage(readXa: Transactor[IO], writeXa: Transactor[I
9393
s"(${bucket.start.toEpochMilli}, ${bucket.end.toEpochMilli}, $idx)"
9494
}.mkString(", ")
9595

96+
// Split into two queries so that the timestamp + failed index can be used for each
9697
val query = sql"""
9798
WITH buckets(bucket_start, bucket_end, bucket_order) AS (
9899
VALUES """ ++ Fragment.const(bucketValues) ++ sql"""
100+
),
101+
valid_counts AS (
102+
SELECT
103+
bucket_start,
104+
bucket_end,
105+
bucket_order,
106+
COUNT(events.rowid) as valid_count
107+
FROM buckets
108+
LEFT JOIN events ON events.timestamp >= buckets.bucket_start
109+
AND events.timestamp < buckets.bucket_end
110+
AND events.failed = false
111+
GROUP BY bucket_start, bucket_end, bucket_order
112+
),
113+
failed_counts AS (
114+
SELECT
115+
bucket_start,
116+
bucket_end,
117+
bucket_order,
118+
COUNT(events.rowid) as failed_count
119+
FROM buckets
120+
INNER JOIN events ON events.timestamp >= buckets.bucket_start
121+
AND events.timestamp < buckets.bucket_end
122+
AND events.failed = true
123+
GROUP BY bucket_start, bucket_end, bucket_order
99124
)
100125
SELECT
101-
bucket_start,
102-
bucket_end,
103-
bucket_order,
104-
COUNT(CASE WHEN events.failed = 0 THEN 1 END) as valid_count,
105-
COUNT(CASE WHEN events.failed = 1 THEN 1 END) as failed_count
106-
FROM buckets
107-
LEFT JOIN events ON events.timestamp >= buckets.bucket_start
108-
AND events.timestamp < buckets.bucket_end
109-
GROUP BY bucket_start, bucket_end, bucket_order
110-
ORDER BY bucket_order
126+
v.bucket_start,
127+
v.bucket_end,
128+
v.bucket_order,
129+
COALESCE(v.valid_count, 0) as valid_count,
130+
COALESCE(f.failed_count, 0) as failed_count
131+
FROM valid_counts v
132+
LEFT JOIN failed_counts f ON v.bucket_start = f.bucket_start
133+
AND v.bucket_end = f.bucket_end
134+
ORDER BY v.bucket_order
111135
"""
112136

113137
query

0 commit comments

Comments
 (0)