I am looking to "upsert" hll's in my database, using a traditional two stage query:
# Add an empty HLL if one doesn't exist
INSERT INTO counts(event_type, reference, count)
VALUES(:event_type, :reference, hll_empty())
ON CONFLICT DO NOTHING;
# Add to the HLL
UPDATE counts
SET count = hll_add(count, hll_hash_text(:event_id))
WHERE event_type = :event_type AND reference = :reference;
Given hll_empty() will be invoked on every query, even in the update case (i.e. before a conflict is identified), how cheap/expensive is that function to execute? The README mentions use of a sentinel value – is this sentinel value recalculated every call?
Should I be concerned with the evaluation of that function being a potential bottleneck compared to hll_add and hll_hash_text?
Looking at the code, hll_empty() in fact creates an empty set (internally represented as a byte array) at every call. So it does not use a precalculated sentinel.
I am looking to "upsert"
hll
's in my database, using a traditional two stage query:Given
hll_empty()
will be invoked on every query, even in the update case (i.e. before a conflict is identified), how cheap/expensive is that function to execute? The README mentions use of a sentinel value – is this sentinel value recalculated every call?Should I be concerned with the evaluation of that function being a potential bottleneck compared to
hll_add
andhll_hash_text
?