相关疑难解决方法(0)

功能表现

来自 MySQL 背景,其中存储过程性能(旧文章)可用性值得怀疑,我正在评估 PostgreSQL 为我公司的新产品。

我想做的一件事是将一些应用程序逻辑移到存储过程中,所以我在这里询问有关在 PostgreSQL (9.0) 中使用函数的 DO 和 DON'T(最佳实践),特别是关于性能陷阱。

postgresql best-practices plpgsql

63
推荐指数
4
解决办法
4万
查看次数

Postgres 函数中的 SQL 注入与准备好的查询

在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入机制
一种方法比另一种方法有什么特别的优势吗?

postgresql sql-injection prepared-statement plpgsql functions

37
推荐指数
1
解决办法
2万
查看次数

EXPLAIN ANALYZE 不显示 plpgsql 函数内查询的详细信息

我在 PostgreSQL 9.3 中使用了一个 PL/pgSQL 函数,里面有几个复杂的查询:

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

如果我跑了EXPLAIN ANALYZE f1(),我只会得到总时间,但没有细节。有没有办法可以获得函数中所有查询的详细结果?

如果函数中的查询不应该被 Postgres 优化,我也会要求解释。

postgresql optimization plpgsql functions explain

25
推荐指数
1
解决办法
2万
查看次数

创建一个临时表,循环,添加数据,从中选择?“查询没有结果数据的目的地”

我正在创建一个临时表,并从多个表中获取数据并将数据插入其中。当我尝试从表中取回数据时,出现错误:

[42601] ERROR: query has no destination for result data
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Run Code Online (Sandbox Code Playgroud)
do
$$
    DECLARE
        sampleproductId   varchar;
        productIds        text[] := array [
            'abc1',
            'abc2'
            ];
        tId              varchar;
        DECLARE result  jsonb;
        DECLARE resultS jsonb[];
    begin
       CREATE TEMP TABLE IF NOT EXISTS product_temp_mapping
        (
            accountid      int,
            productUID      varchar,
            sampleproductId text
        );
        FOREACH sampleproductId IN ARRAY productIds
            LOOP
                tId := (select id
                        from product.product
                        where uid = sampleproductId);
                INSERT into product_temp_mapping …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

2
推荐指数
1
解决办法
3685
查看次数

SELECT 中的廉价函数如何使整个查询变慢?

我将 Postgres 13.3 与内部和外部查询一起使用,它们都只产生一行(只是一些关于行数的统计数据)。

我不明白为什么下面的 Query2 比 Query1 慢得多。它们基本上应该几乎完全相同,最多可能只有几毫秒的差异......

查询 1:需要 49 秒

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)

查询 2:需要 4 分 30 秒

我只添加了一行:

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 cte parallelism functions postgresql-performance

1
推荐指数
1
解决办法
160
查看次数