Estou tentando extrair todo o desempenho do meu banco de dados PostgreSQL e também quero abstrair minhas definições de consulta da minha camada de aplicativo.
Para fazer isso, estou usando uma função com valor de tabela. No entanto, percebi que as funções apresentam desempenho pior do que as consultas brutas.
Minha definição de tabela é
CREATE TABLE public.entry
(
id BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
topic_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
content TEXT NOT NULL,
nstd_upvote_count INT NOT NULL,
nstd_downvote_count INT NOT NULL,
create_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
update_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
CONSTRAINT pk_entry PRIMARY KEY (id),
CONSTRAINT fk_entry_topic_id_topic FOREIGN KEY (topic_id) REFERENCES public.topic(id),
CONSTRAINT fk_entry_user_id_user FOREIGN KEY (user_id) REFERENCES public."user"(id)
);
CREATE INDEX ix_entry_topic_id_create_timestamp ON entry
(
topic_id ASC,
create_timestamp ASC
);
CREATE INDEX ix_entry_user_id_create_timestamp ON entry
(
user_id ASC,
create_timestamp ASC
);
Minha definição de função é:
CREATE OR REPLACE FUNCTION public.udf_entry_get_by_id
(
p_id BIGINT
)
RETURNS TABLE
(
id BIGINT
,topic_id BIGINT
,user_id BIGINT
,content TEXT
,create_timestamp TIMESTAMP(6) WITH TIME ZONE
,update_timestamp TIMESTAMP(6) WITH TIME ZONE
)
LANGUAGE sql
AS $func$
SELECT
e.id
,e.topic_id
,e.user_id
,e.content
,e.create_timestamp
,e.update_timestamp
FROM public.entry AS e
WHERE e.id = p_id
$func$ STABLE;
Como chamo minha função:
SELECT * FROM udf_entry_get_by_id(13642);
Explique Analise:
Index Scan using pk_entry on entry e (cost=0.29..2.50 rows=1 width=289) (actual time=0.029..0.032 rows=1 loops=1)
Index Cond: (id = '13642'::bigint)
Planning Time: 0.237 ms
Execution Time: 0.059 ms
Minha consulta bruta:
SELECT e.id, e.topic_id, e.user_id, e.content, e.create_timestamp, e.update_timestamp FROM public.entry AS e WHERE e.id = 13642;
Explique Analise:
SELECT e.id, e.topic_id, e.user_id, e.content, e.create_timestamp, e.update_timestamp FROM public.entry AS e WHERE e.id = 13642;
Index Scan using pk_entry on entry e (cost=0.29..2.50 rows=1 width=289) (actual time=0.030..0.033 rows=1 loops=1)
Index Cond: (id = 13642)
Planning Time: 0.112 ms
Execution Time: 0.063 ms
Minha pergunta é: o tempo de planejamento afeta o desempenho da minha aplicação? Se as funções com valor de tabela são armazenadas em cache, por que o tempo de planejamento das funções é muito maior?
Obrigado pela ajuda.