Has*_*yed 5 postgresql performance postgresql-performance
我正在研究多租户存储网关。
每个租户都有自己的架构——每个租户的架构是一个元架构,因此每个租户架构都是相同的。数据库交互仅通过存储过程 API 发生。存储过程层位于公共架构上。存储过程依赖于设置为 的 search_path <TENANT_SCHEMA>;public
。
应用层根据公共模式中的存储过程准备语句。
我有一个用于切换租户的存储过程,如下所示:
CREATE OR REPLACE FUNCTION domains_switch(domain DOMAIN_NAME) RETURNS VOID AS $$ BEGIN
IF EXISTS (SELECT NULL FROM public.domains WHERE domain_name = domain) THEN
EXECUTE format('set search_path=%s,public;', domain);
ELSE
RAISE 'domain "%" does not exist',domain USING ERRCODE = 'AX001';
END IF;
RETURN; END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
plpgsql
存储过程自己管理计划,这意味着我只需要在网关中为每个后端准备一次 api 语句。我怀疑当我切换模式时存储过程的内部缓存计划无效。
我计划在网关的连接池管理中添加一个层,以最小化 search_path 开关。我的直觉正确吗?这是正确的做法吗?
我想说你的直觉是正确的。更改search_path
导致 Postgres 从头开始使用准备好的语句。手册上PREPARE
:
此外,如果 的值
search_path
从一次使用更改为下一次使用,则将使用新的search_path
. (后一种行为是 PostgreSQL 9.3 中的新行为。)
PL/pgSQL 函数内的 SQL 语句被视为准备好的语句。
特别是在使用连接池时(同一连接保持打开状态),如果您不断将其切换search_path
到最低限度,这将有助于提高性能。
对于简单的语句来说,额外的成本并不太高,但对于更复杂的查询来说,它可能会产生明显的影响。
归档时间: |
|
查看次数: |
828 次 |
最近记录: |