使用临时表Postgresql的共享内存

时间:2017-05-11 21:11:15

标签: postgresql

我正在使用临时表,如下所示

DROP TABLE IF EXISTS tmp;

CREATE temporary TABLE tmp
(Id_alert int,
Varchar alert_name)
  On commit drop;

这是生成以下日志

  

CONTEXT:SQL语句“DROP TABLE IF EXISTS tmp”           PL / pgSQL函数update_sensor_event_process_t()在SQL语句第51行错误:超出共享内存提示:您可能需要   增加max_locks_per_transaction。

我还看到我的磁盘空间受到了损害。

[pipelinedb@pipelinedb-hom log]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        30G   29G  1.1G  97% /
devtmpfs        7.4G     0  7.4G   0% /dev
tmpfs           7.4G  129M  7.3G   2% /dev/shm
tmpfs           7.4G   49M  7.3G   1% /run
tmpfs           7.4G     0  7.4G   0% /sys/fs/cgroup
tmpfs           1.5G     0  1.5G   0% /run/user/1000
tmpfs           1.5G     0  1.5G   0% /run/user/1004

低于完整功能

CREATE OR REPLACE FUNCTION public.update_sensor_event_process_t()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$   
DECLARE records int;
DECLARE linha record;  
DECLARE linhaCtrl record;
DECLARE linhaInsert record;

BEGIN

INSERT INTO PUBLIC.sensor_event_process 
            ( 
                        id_regra, 
                        regra, 
                        id_veiculo, 
                        id_cliente, 
                        velocidade, 
                        odometro, 
                        data_posicao, 
                        ibutton, 
                        latitude, 
                        longitude, 
                        status, 
                        id_evento 
            ) 
            VALUES 
            ( 
                        new.id_regra, 
                        new.regra, 
                        new.id_veiculo, 
                        new.id_cliente, 
                        new.velocidade, 
                        new.odometro, 
                        new.data_posicao, 
                        new.ibutton, 
                        new.latitude, 
                        new.longitude, 
                        new.status, 
                        new.id_evento)
              ON conflict (id_veiculo) DO UPDATE 
              SET      id_regra = new.id_regra, 
                       regra = new.regra , 
                       id_cliente = new.id_cliente, 
                       velocidade = new.velocidade, 
                       odometro = new.odometro, 
                       data_posicao = new.data_posicao, 
                       ibutton = new.ibutton, 
                       latitude = new.latitude, 
                       longitude = new.longitude, 
                       status = new.status, 
                       id_evento = new.id_evento;

DROP TABLE IF EXISTS tmp;

CREATE temporary TABLE tmp
(id_alerta int  , 
nome_alerta varchar, 
id_tipo_regra int, 
data_posicao bigint, 
velocidade int , 
odometro bigint, 
latitude float, 
longitude float, 
ibutton varchar, 
id_motorista_responsavel int, 
placa_veiculo varchar, 
apelido_veiculo varchar, 
id_cliente int,
id_veiculo int,
status boolean,
veiculo_gmt varchar)  on commit drop; 

INSERT INTO  tmp 
 SELECT DISTINCT re.id_alerta, 
                re.nome_alerta, 
                re.id_tipo_regra, 
                COALESCE(sep.data_posicao, -1) AS data_posicao, 
                sep.velocidade, 
                sep.odometro, 
                sep.latitude, 
                sep.longitude, 
                sep.ibutton, 
                re.id_motorista_responsavel, 
                re.placa_veiculo, 
                re.apelido_veiculo, 
                re.id_cliente,
                re.id_veiculo, 
                sep.status, 
                re.veiculo_gmt
FROM            public.rule_event re 
JOIN            public.rule_event re2 
ON              re.id_alerta = re2.id_alerta 
LEFT JOIN       public.sensor_event_process sep 
ON              sep.id_veiculo = re.id_veiculo 
AND             sep.id_regra = re.id_tipo_regra 
AND             sep.data_posicao = new.data_posicao 
WHERE           re.id_veiculo = new.id_veiculo 
        AND re.id_alerta = new.id_evento;

FOR linhaCtrl IN SELECT DISTINCT id_alerta FROM tmp WHERE status IS FALSE
    LOOP
     UPDATE public.controle_notificacao SET evento_enviado = FALSE WHERE id_evento = linhaCtrl.id_alerta;
    END LOOP;

DELETE 
FROM   tmp 
WHERE  id_alerta IN 
       ( 
              SELECT id_alerta 
              FROM   tmp 
              WHERE  data_posicao = -1  or status is false);

INSERT INTO public.device_event 
            ( 

                        id_cliente, 
                        id_veiculo, 
                        placa_veiculo, 
                        apelido_veiculo, 
                        id_evento, 
                        nome_evento,
                        id_motorista, 
                        gmt_evento, 
                        nome_motorista, 
                        data_evento, 
                        latitude, 
                        longitude, 
                        ignicao, 
                        velocidade, 
                        ibutton
            ) 
SELECT DISTINCT  
       id_cliente, 
       id_veiculo, 
       placa_veiculo, 
       apelido_veiculo, 
       id_alerta, 
       nome_alerta,
       id_motorista_responsavel, 
       veiculo_gmt, 
       '', 
       data_posicao, 
       new.latitude, 
       new.longitude, 
       new.ignicao, 
       new.velocidade, 
       new.ibutton
FROM   tmp 
LEFT  JOIN  public.controle_notificacao cn ON id_alerta  = cn.id_evento 
WHERE id_veiculo = NEW.id_veiculo AND data_posicao = NEW.data_posicao
AND (cn.evento_enviado is false OR cn.evento_enviado IS NULL);
;

 FOR linha in 
    SELECT DISTINCT '{"event":' || 
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
        (ROW_TO_JSON(q)::text,
        'client','Client'), 
        'identifiervehicle','identifierVehicle'),
        'vehicleplate','vehiclePlate'), 
        'vehiclenickname','vehicleNickname'),
        'identifiereventrule','identifierEventRule'), 
        'identifierdriver', 'identifierDriver'),
        'eventgmt','eventGmt'), 
        'drivername', 'driverName'), 
        'dateevent','dateEvent'), 
        'vehiclestatus','vehicleStatus'), 
        'vehiclespeed','vehicleSpeed'),
        'driveributton', 'driverIbutton') ,
        'nameeventrule', 'nameEventRule')
         || '}' AS msg, 
                identifiereventrule,
                severity
        FROM   (SELECT de.id_device_event AS identifier, 
                       de.id_cliente      AS identifierClient, 
                       de.id_veiculo      AS identifierVehicle, 
                       de.placa_veiculo   AS vehiclePlate, 
                       de.apelido_veiculo AS vehicleNickname, 
                       de.id_evento    AS identifierEventRule, 
                       de.id_motorista    AS identifierDriver, 
                       de.gmt_evento      AS eventGmt, 
                       de.nome_motorista  AS driverName, 
                       de.data_evento     AS dateEvent, 
                       de.latitude, 
                       de.longitude, 
                       de.ignicao         AS vehicleStatus, 
                       de.velocidade      AS vehicleSpeed, 
                       de.ibutton         AS driverIbutton,
                       de.nome_evento  AS nameEventRule,
                       ev.severidade   AS severity
            FROM   PUBLIC.device_event de
            INNER JOIN PUBLIC.rule_event ev on ev.id_alerta = de.id_evento
            LEFT  JOIN  public.controle_notificacao cn ON de.id_evento  = cn.id_evento 
            WHERE   de.id_veiculo = NEW.id_veiculo 
                AND de.data_evento = NEW.data_posicao 
                AND (cn.evento_enviado is false OR cn.evento_enviado IS NULL)
            ) AS q  

        LOOP

            PERFORM pipeline_kafka.produce_message('topicAlertDevice', CAST(linha.msg AS bytea));

            INSERT INTO   public.controle_notificacao (id_evento, evento_enviado) VALUES (linha.identifierEventRule , true ) 
            ON CONFLICT (id_evento) DO UPDATE SET evento_enviado = true;     

        END LOOP;

RETURN NEW;

END;
$function$;

0 个答案:

没有答案