Проблемы с производительностью в PostgreSQL - PullRequest
0 голосов
/ 15 мая 2019

Мы работаем над преобразованием БД из SQL Server в Aurora PostgreSQL. Для некоторых функций в базе данных мы наблюдаем очень высокое время выполнения в PG (30+ секунд) по сравнению с SQL Server (0,5-2 секунды).

Мы уже установили для параметров базы данных значения, необходимые для оптимальной производительности.

Многие из этих функций ссылаются на таблицы из другой базы данных с использованием представлений внешних таблиц.

Ожидание клиента - производительность функций должна быть, по крайней мере, если не лучше, чем у нас в настоящее время на сервере SQL.

Как улучшить производительность в PG?

Ниже приведены соответствующие данные конфигурации:

SQL server config: Microsoft SQL Server 2012 (SP4) (KB4018073) – 11.0.7001.0 (X64). RAM: 16GB. Inter Xeon
Aurora RDS config: 4 vCPU, 30.5 GB RAM.

Пример кода:

Пример кода: // этот занимает менее одной секунды.

insert into temptable(
                column1 ,column2,column3 ,
                column4 ,column5, column6 ,
                column7                                                             
        )
    SELECT  --DISTINCT
        t.col AS column1, d.column1,null as column3 ,
                null as column4 ,null as column5,null as column6 ,
                null as column7 
    FROM 
        view1 AS d
        INNER JOIN table2 AS t
            ON t.column2= d.column1
        LEFT OUTER JOIN table2 AS i
            ON i.col1 = t.col AND i.col = t.col2 AND i.col = var1 AND i.svc_type = var2
            AND i.col2= var3 AND i.col1 = var4
    WHERE 
        (i.col3 = 'XXX' OR d.col3 = 'XX') 
        AND i.col4 IN (var5, var6) 
        ;
// This update query only taking 27 seconds and result 39 rows      
update temptable set 
        column3=function1(column2, v1, v2, v3), -- this is single execution it took 412ms
        column4=function2(column2, v3),-- this is single execution it took 350ms
        column5=function3(column2, v3),
        column6=function4(column2),
        column7=function5(column2);
// this one taking less then one seconds.
OPEN rs1 FOR
    select  column1 ,column2,column3 ,
                column4 ,column5, column6 ,
                column7 from temptable;
    RETURN NEXT rs1;
...