Hello,

I am trying to implement an efficient "like" over a text[]. I see a lot of 
people have tried before me and I learnt a lot through the forums. The results 
of my search is that a query like the following is optimal:

select count(*)
  from claims
where (select count(*)
          from unnest("ICD9_DGNS_CD") x_
         where x_ like '427%'
       ) > 0

So I figured I'd create a Function to encapsulate the concept:

CREATE OR REPLACE FUNCTION ArrayLike(text[], text)
RETURNS bigint
AS 'select count(*) from unnest($1) a where a like $2'
LANGUAGE SQL STRICT IMMUTABLE LEAKPROOF

This works functionally, but performs like crap: full table scan, and cannot 
make use of any index it seems. Basically, it feels like PG can't inline that 
function.

I have been trying all evening to find a way to rewrite it to trick the 
compiler/planner into inlining. I tried the operator approach for example, but 
performance is again not good.

create function rlike(text,text)
returns bool as 'select $2 like $1' language sql strict immutable;
create operator  ``` (procedure = rlike, leftarg = text,
                      rightarg = text, commutator = ```);
CREATE OR REPLACE FUNCTION MyLike(text[], text)
RETURNS boolean
AS 'select $2 ``` ANY($1)'
LANGUAGE SQL STRICT IMMUTABLE LEAKPROOF

And by not good, I mean that on my table of 2M+ rows, the "native" query takes 
3s, while the function version takes 9s and the operator version takes (via the 
function, or through the operator directly), takes 15s.

Any ideas or pointers?


Thank you,
Laurent Hasson

Reply via email to