2009/12/5 Sam Mason <s...@samason.me.uk>

> Would a GIN index help?  You'd be able to ask if a 'foo' appears
> anywhere in the array (or some subset if you want).  You can then have a
> subsequent filter that actually expresses the clause you want.  Not sure
> what selectivity you're dealing with and if this would be a problem.
>

I think that wouldn't be good for me, since the table will be 2-3M rows
large and will be updated very often, and GIN indices are too slow at that.
(In fact, the whole table's goal is to avoid updating GIN indices so
frequently.)


> Arrays and PG (not sure how well other databases handle this case
> either) don't work too well.  Have you thought about normalising your
> schema a bit to give the database more help?


I don't have any idea how I could do that... except for creating separate
tables for all "type"s. But I don't think that would be a better option. If
you have any other idea, I'd really appreciate it.


> I'd say ROW is doing the wrong thing here, but I think other people may
> well disagree with me.  Composite/non-atomic types don't exist in the
> SQL spec much (AFAIK) hence their behavior is somewhat ad-hoc and tends
> to reflect the original use case rather than being too consistent.
>

According to the documentation,
http://www.postgresql.org/docs/8.4/static/functions-comparisons.html#ROW-WISE-COMPARISON
"Note: Prior to PostgreSQL 8.2, the <, <=, > and >= cases were not handled
per SQL specification."
I think the way ROW comparisons work now is per SQL specification.

But wait! Thank you for making me read this part of the docs, because I've
just found what I was looking for, at the very end of the page:


> Note: The SQL specification requires row-wise comparison to return NULL if
> the result depends on comparing two NULL values or a NULL and a non-NULL.
> PostgreSQL does this only when comparing the results of two row constructors
> or comparing a row constructor to the output of a subquery (as in Section
> 9.20). In other contexts where two composite-type values are compared, two
> NULL field values are considered equal, and a NULL is considered larger than
> a non-NULL. This is necessary in order to have consistent sorting and
> indexing behavior for composite types.


I was sure I've read this part of the docs a hundred times, so I've gone
after why I didn't find this before: this note is new in the 8.4 docs, it
wasn't there before (and I'm using 8.3).
http://www.postgresql.org/docs/8.3/static/functions-comparisons.html#ROW-WISE-COMPARISON
But I'm pretty sure now that I can rely on this.


Thanks,
Denes Daniel

Reply via email to