{{{
#!div style="font-size: 80%"
{{{#!sql
WHERE (col_a, col_b) > ('value_a', 'value_b')
ORDER BY (col_a, col_b)
}}}
}}}
While this sort of this is semantically the same as
{{{
#!div style="font-size: 80%"
{{{#!sql
WHERE col_a > 'value_a' OR (col_a = 'value_a' AND col_b > 'value_b')
ORDER BY (col_a, col_b)
}}}
}}}
which can be expressed using the Django ORM, PostgreSQL at least treats
these differently in terms of applying indexes. Essentially, the tuple
version (from my brief testing) is better in the presence of a multi-
column index on `col_a, col_b`: it seems to avoid quite a lot of scanning.
My ultimate use case for this is cursor-based pagination, where the cursor
is a tuple of 2 columns: an "almost" unique datetime, and a fully unique
ID for tie-breakers.
--
Ticket URL: <https://code.djangoproject.com/ticket/33138>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
> The below doesn't seem possible without resorting to `extra`
>
> {{{
> #!div style="font-size: 80%"
> {{{#!sql
> WHERE (col_a, col_b) > ('value_a', 'value_b')
> ORDER BY (col_a, col_b)
> }}}
> }}}
>
> While this sort of this is semantically the same as
>
> {{{
> #!div style="font-size: 80%"
> {{{#!sql
> WHERE col_a > 'value_a' OR (col_a = 'value_a' AND col_b > 'value_b')
> ORDER BY (col_a, col_b)
> }}}
> }}}
>
> which can be expressed using the Django ORM, PostgreSQL at least treats
> these differently in terms of applying indexes. Essentially, the tuple
> version (from my brief testing) is better in the presence of a multi-
> column index on `col_a, col_b`: it seems to avoid quite a lot of
> scanning.
>
> My ultimate use case for this is cursor-based pagination, where the
> cursor is a tuple of 2 columns: an "almost" unique datetime, and a fully
> unique ID for tie-breakers.
New description:
The below doesn't seem possible without resorting to `extra`
{{{
#!div style="font-size: 80%"
{{{#!sql
WHERE (col_a, col_b) > ('value_a', 'value_b')
ORDER BY (col_a, col_b)
}}}
}}}
While this is semantically the same as
{{{
#!div style="font-size: 80%"
{{{#!sql
WHERE col_a > 'value_a' OR (col_a = 'value_a' AND col_b > 'value_b')
ORDER BY (col_a, col_b)
}}}
}}}
which can be expressed using the Django ORM, PostgreSQL at least treats
these differently in terms of applying indexes. Essentially, the tuple
version (from my brief testing) is better in the presence of a multi-
column index on `col_a, col_b`: it seems to avoid quite a lot of scanning.
My ultimate use case for this is cursor-based pagination, where the cursor
is a tuple of 2 columns: an "almost" unique datetime, and a fully unique
ID for tie-breakers.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/33138#comment:1>
* status: new => closed
* resolution: => duplicate
* component: Uncategorized => Database layer (models, ORM)
* type: Uncategorized => New feature
Comment:
Duplicate of #29527. Please feel-free to continue the discussion in
#29527. We can reopen the ticket if you/someone will provide PoC.
--
Ticket URL: <https://code.djangoproject.com/ticket/33138#comment:2>