Additional database indices
===========================

If you have a large pretix database, some features such as search for orders or events might turn pretty slow.
For PostgreSQL, we have compiled a list of additional database indexes that you can add to speed things up.
Just like any index, they in turn make write operations insignificantly slower and cause the database to use
more disk space.

The indexes aren't automatically created by pretix since Django does not allow us to do so only on PostgreSQL
(and they won't work on other databases). Also, they're really not necessary if you're not having tens of
thousands of records in your database.

However, this also means they won't automatically adapt if some of the referred fields change in future updates of pretix
and you might need to re-check this page and change them manually.

Here is the currently recommended set of commands::

    CREATE EXTENSION pg_trgm;

    CREATE INDEX CONCURRENTLY pretix_addidx_event_slug
        ON pretixbase_event
        USING gin (upper("slug") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_event_name
        ON pretixbase_event
        USING gin (upper("name") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_order_code
        ON pretixbase_order
        USING gin (upper("code") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_voucher_code
        ON pretixbase_voucher
        USING gin (upper("code") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_invoice_nu1
        ON "pretixbase_invoice" (UPPER("invoice_no"));
    CREATE INDEX CONCURRENTLY pretix_addidx_invoice_nu2
        ON "pretixbase_invoice" (UPPER("full_invoice_no"));
    CREATE INDEX CONCURRENTLY pretix_addidx_organizer_name
        ON pretixbase_organizer
        USING gin (upper("name") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_organizer_slug
        ON pretixbase_organizer
        USING gin (upper("slug") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_order_email
        ON pretixbase_order
        USING gin (upper("email") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_order_comment
        ON pretixbase_order
        USING gin (upper("comment") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_order_event_date_id
        ON public.pretixbase_order (event_id, datetime, id);
    CREATE INDEX CONCURRENTLY pretix_addidx_orderpos_name
        ON pretixbase_orderposition
        USING gin (upper("attendee_name_cached") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_orderpos_secret
        ON pretixbase_orderposition
        USING gin (upper("secret") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_orderpos_email
        ON pretixbase_orderposition
        USING gin (upper("attendee_email") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_ia_name
        ON pretixbase_invoiceaddress
        USING gin (upper("name_cached") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_ia_company
        ON pretixbase_invoiceaddress
        USING gin (upper("company") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_orderpos_email_upper
        ON public.pretixbase_orderposition (upper((attendee_email)::text));
    CREATE INDEX CONCURRENTLY pretix_addidx_voucher_code_upper
        ON public.pretixbase_voucher (upper((code)::text));
    CREATE INDEX CONCURRENTLY pretix_addidx_logentry_event_date_id
        ON public.pretixbase_logentry (event_id, datetime, id);
    CREATE INDEX CONCURRENTLY pretix_addidx_logentry_event_cid_date_id
        ON public.pretixbase_logentry (event_id, content_type_id, datetime, id);


Also, if you use our ``pretix-shipping`` plugin::

    CREATE INDEX CONCURRENTLY pretix_addidx_sa_name
        ON pretix_shipping_shippingaddress
        USING gin (upper("name") gin_trgm_ops);
    CREATE INDEX CONCURRENTLY pretix_addidx_sa_company
        ON pretix_shipping_shippingaddress
        USING gin (upper("company") gin_trgm_ops);

