它使用的时候可能pgadmin
还是plsql
获得查询计划的搁置了内部执行SQL语句ü SER d efined ˚F油膏(UDF)使用EXPLAIN
。那么我如何掌握 UDF 的特定调用的查询计划呢?我看到 UDF 抽象为F()
pgadmin 中的单个操作。
我查看了文档,但找不到任何内容。
目前我正在提取语句并手动运行它们。但这不会减少大型查询。
例如,考虑下面的 UDF。这个 UDF,即使它能够打印出它的查询字符串,也不能使用复制粘贴,因为它有一个本地创建的临时表,当你粘贴和执行它时它不存在。
CREATE OR REPLACE FUNCTION get_paginated_search_results(
forum_id_ INTEGER,
query_ CHARACTER VARYING,
from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
in_categories_ INTEGER[] DEFAULT '{}')
RETURNS SETOF post_result_entry AS $$
DECLARE
join_string CHARACTER VARYING := ' ';
from_where_date CHARACTER VARYING := ' ';
to_where_date CHARACTER VARYING := ' ';
query_string_ CHARACTER VARYING …
Run Code Online (Sandbox Code Playgroud) 我正在研究多租户存储网关。
每个租户都有自己的架构——每个租户的架构是一个元架构,因此每个租户架构都是相同的。数据库交互仅通过存储过程 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 开关。我的直觉正确吗?这是正确的做法吗?