我正在使用临时表,如下所示
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$;