Hi all,

after migrating an EOF application to Cayenne, I noticed many queries running 
much slower than before and with more load on the database. Turns out that 
Cayenne generates queries using ILIKE where EOF used to generate UPPER() 
comparisons. Example:

EOF:     SELECT * FROM mytable t0 WHERE UPPER(mycolumn) LIKE UPPER('foo%')
Cayenne: SELECT * FROM mytable t0 WHERE mycolumn ILIKE 'foo%'

The database is PostgreSQL 9.5, and I used to cover the UPPER() queries with 
function-based indexes on UPPER(column), which used to work very well.

ILIKE is not as easy to index with PostgreSQL, because it's semantically 
different, especially with languages that don't have a simple alphabet. There 
are GiST and GIN index types in PostgreSQL, but those have other drawbacks (too 
many hits for short columns, needing additional table accesses, no sorting by 
index, expensive updates in the case of GiST, and so on).

So, my question is: can I change what Cayenne generates here and generate 
UPPER() or LOWER() comparisons so that I can continue using the existing 
indexes, and what would be the recommended way to do that?

Thanks
Maik

Reply via email to