如何索引to_char()列的 a ?
我试过了:
adam_db=> CREATE INDEX updates_hourly_idx
ON updates (to_char(update_time, 'YYYY-MM-DD HH24:00'));
Run Code Online (Sandbox Code Playgroud)
但是得到了错误:
错误:必须标记索引表达式中的函数
IMMUTABLE
这看起来很奇怪,因为to_char()时间戳是相当不可变的。
任何想法如何生成该索引?
如何从 Postgres 中的 json(b) 对象中提取/获取/选择“子对象”?
似乎有很多信息几乎可以让我到达那里,但又不完全是。很多关于转换为记录、过滤然后从中构建新对象的内容。说实话,我真的很惊讶这不是内置功能。也许有一种简单的方法可以通过组合内置 fns 来实现此目的?我正在寻找的本质上相当于select-keys;一个函数(比如jsonb_select_keys)给出了这个:
SELECT jsonb_select_keys('{"a":42,"b":43,"c":44,"d":97}', '{a,d,e}');
Run Code Online (Sandbox Code Playgroud)
会返回这个:
{"a":42,"d":97}
Run Code Online (Sandbox Code Playgroud)
有点像jsonb_path_query_array,但针对的是 kv 对而不是值。
我对如何做某事没有疑问,但我是否应该这样做。抱歉,如果有更合适的论坛。
我有一个功能:
CREATE OR REPLACE FUNCTION get_name(user_id UUID) RETURNS TEXT AS $$
SELECT username
FROM users
WHERE users.id=user_id
$$ LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)
我喜欢使用这个函数在其他查询中从 user_id 转换为用户名。这是一个常见的操作,我认为一个函数会加快开发时间,以查找一次性统计数据以进行数据分析。我不关心查询速度。这是使用函数来执行此操作的好习惯还是我应该只执行连接?
我对此很陌生,我的同事说将函数用于常规选择/连接可以执行的操作是不好的做法。他还提到,函数最好用于常规选择无法完成的事情。所以我想问其他人什么是好的做法?
编辑:如果这是一种不好的做法,那么对于函数执行稍微复杂一些的常见操作的情况是否更合理?
在这个答案中, Erwin 将IMMUTABLE函数分解为可以内联的函数和不能内联的函数。他有一个例子to_char(),表明IMMUTABLE函数 overto_char()实际上会更慢。
不过这很有趣,因为我什至不知道to_char()不是IMMUTABLE。此外,我不知道这IMMUTABLE会让任何事情变得更慢。我现在的问题是,如何确定标记为IMMUTABLE内联的函数是否被内联?
postgresql performance optimization execution-plan functions
我有这样的表:
table a (
id
--
p1 text,
p2 text,
p3 text
)
Run Code Online (Sandbox Code Playgroud)
当我编写一些使用该表的函数时,我需要编写这样的代码
create or replace function ...
select * from a
where a.p1 is not null
and a.p2 is not null
and a.p3 is not null
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数,
create function my_function(??? val) returns boolean as -- what I need to place instead of ???
$$
begin
return val.p1 is not null
and val.p2 is not null
and val.p3 is not null;
end;
$$ language plpgsql
Run Code Online (Sandbox Code Playgroud)
其中我将传递当前行的“this”实例(我不知道它是如何调用的),我的函数将如下所示:
select * from …Run Code Online (Sandbox Code Playgroud) 我将 Postgres 13.3 与内部和外部查询一起使用,它们都只产生一行(只是一些关于行数的统计数据)。
我不明白为什么下面的 Query2 比 Query1 慢得多。它们基本上应该几乎完全相同,最多可能只有几毫秒的差异......
WITH t1 AS (
SELECT
(SELECT COUNT(*) FROM racing.all_computable_xformula_bday_combos) AS all_count,
(SELECT COUNT(*) FROM racing.xday_todo_all) AS todo_count,
(SELECT COUNT(*) FROM racing.xday) AS xday_row_count
OFFSET 0 -- this is to prevent inlining
)
SELECT
t1.all_count,
t1.all_count-t1.todo_count AS done_count,
t1.todo_count,
t1.xday_row_count
FROM t1;
Run Code Online (Sandbox Code Playgroud)
我只添加了一行:
WITH t1 AS (
SELECT
(SELECT COUNT(*) FROM racing.all_computable_xformula_bday_combos) AS all_count,
(SELECT COUNT(*) FROM racing.xday_todo_all) AS todo_count,
(SELECT COUNT(*) …Run Code Online (Sandbox Code Playgroud) postgresql ×6
functions ×5
cte ×1
index ×1
json ×1
optimization ×1
parallelism ×1
performance ×1