Skip to content

clerk.users.count with arguments can be very slow for large number of users #176

Description

@henryharbeck

Repro

import time
import clerk_backend_api
from clerk_backend_api import Clerk

print(clerk_backend_api.__version__) # 3.1.11 (latest)

clerk_api_key = "xxxxx"
clerk = Clerk(bearer_auth=clerk_api_key)

start_all = time.perf_counter()
all_users = clerk.users.count().total_count
end_all = time.perf_counter()

print(f"{all_users = } (took {end_all - start_all:.3f} seconds)")
# all_users = 926354 (took 0.342 seconds)

created_before_ms = int(time.time() * 1000)

start_before = time.perf_counter()
users_before_ts = clerk.users.count(created_at_before=created_before_ms).total_count
end_before = time.perf_counter()

print(f"{users_before_ts = } (took {end_before - start_before:.3f} seconds)")
# users_before_ts = 926354 (took 436.951 seconds)

As you can see, adding a predicate to users.count changes the response time from sub 1 second to ~7 minutes.

I appreciate the "COUNT *" fast path, but 7 minutes feels very long in the other case.
Is it possible that performance can be improved here at all?

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions