Может ли кто-нибудь объяснить разницу в производительности между этими тремя запросами?
concat()
функция:
explain analyze
select * from person
where (concat(last_name, ' ', first_name, ' ', middle_name) like '%Ива%');
Seq Scan on person (cost=0.00..4.86 rows=1 width=15293) (actual time=0.032..0.140 rows=6 loops=1)
Filter: (pg_catalog.concat(last_name, ' ', first_name, ' ', middle_name) ~~ '%Ива%'::text)
Total runtime: 0.178 ms
Стандартная конкатенация SQL с ||
:
explain analyze
select * from person
where ((last_name || ' ' || first_name || ' ' || middle_name) like '%Ива%');
Seq Scan on person (cost=0.00..5.28 rows=1 width=15293) (actual time=0.023..0.080 rows=6 loops=1)
Filter: ((((((last_name)::text || ' '::text) || (first_name)::text) || ' '::text) || (middle_name)::text) ~~ '%Ива%'::text)
Total runtime: 0.121 ms
Поля поиска отдельно:
explain analyze
select * from person
where (last_name like '%Ива%') or (first_name like '%Ива%') or (middle_name like '%Ива%');
Seq Scan on person (cost=0.00..5.00 rows=1 width=15293) (actual time=0.018..0.060 rows=6 loops=1)
Filter: (((last_name)::text ~~ '%Ива%'::text) OR ((first_name)::text ~~ '%Ива%'::text) OR ((middle_name)::text ~~ '%Ива%'::text))
Total runtime: 0.097 ms
Почему concat()
самый медленный, а несколько like
условий быстрее?
pg.concat
самый медленный, а несколькоlike
быстрее? - person Yegor Koldov   schedule 13.04.2015last_name||' '||first_name||' '||middle_name
(думаю, в вашем случае ручная конкатенация лучше, чем concat()) - person Vivek S.   schedule 13.04.2015concat()
является функцией, когда вы выполняете свой выбранный postgres вызов, которыйconcat()
для операции - person Vivek S.   schedule 13.04.2015select count(*) from person
производит43
- person Yegor Koldov   schedule 13.04.2015