Hello,

I run a query transforming huge tables to a json document based on a period.
It works great for a modest period (little dataset).
However, when increasing the period (huge dataset) I get this error:

SQL ERROR[54000]
ERROR: array size exceeds the maximum allowed (1073741823)


Thanks by advance,

Informations:

postgresql 9.4
shared_buffers = 55GB
64bit Red Hat Enterprise Linux Server release 6.7

the query:
 WITH sel AS
  (SELECT ids_pat,
          ids_nda
   FROM eds.nda
   WHERE (dt_deb_nda >= '20150101'
          AND dt_deb_nda <= '20150401')),
      diag AS
  ( SELECT ids_nda_rum,
           json_agg(diago) AS diago,
           count(1) AS total
   FROM
     (SELECT ids_nda_rum,
             json_build_object( 'cd_cim', cd_cim,
'lib_cim',lib_typ_diag_tr, 'dt_cim',dt_exec) AS diago
      FROM eds.fait_diag_tr
      WHERE ids_nda IN
          (SELECT ids_nda
           FROM sel)
      ORDER BY dt_exec) AS diago2
   GROUP BY ids_nda_rum),
      act AS
  ( SELECT ids_nda_rum,
           json_agg(acto) AS acto,
           count(1) AS total
   FROM
     ( SELECT ids_nda_rum,
              json_build_object( 'cd_act',cd_ccam, 'dt_act',dt_exec) AS acto
      FROM eds.fait_act_tr
      WHERE ids_nda IN
          (SELECT ids_nda
           FROM sel)
      ORDER BY dt_exec) AS acto2
   GROUP BY ids_nda_rum ),
      ghm AS
  ( SELECT ids_nda_rum,
           json_agg(ghmo) AS ghmo,
           count(1) AS total
   FROM
     ( SELECT ids_nda_rum,
              json_build_object( 'cd_ghm',cd_ghm, 'cd_ghs',cd_ghs,
'status',lib_statut_tr, 'dt_maj_rum_ghm',dt_maj_rum_ghm) AS ghmo
      FROM eds.nda_rum_ghm_tr
      LEFT JOIN eds.nda_rum_tr rum USING (ids_nda_rum)
      WHERE nda_rum_ghm_tr.ids_nda IN
          (SELECT ids_nda
           FROM sel)
        AND rum.cd_rum = 'RSS'
      ORDER BY dt_maj_rum_ghm) AS ghmo
   GROUP BY ids_nda_rum ),
      lab AS
  (SELECT ids_nda,
          json_agg(lab) AS labo,
          count(1) AS total
   FROM
     (SELECT ids_nda,
             json_build_object( 'valeur_type_tr',valeur_type_tr,
'dt_fait', dt_fait, 'unite',unite, 'cd_test_lab',cd_test_lab,
'valeur_sign_tr',valeur_sign_tr, 'valeur_num_tr',valeur_num_tr,
'valeur_text_tr',valeur_text_tr,
'valeur_abnormal_tr',valeur_abnormal_tr) AS lab
      FROM eds.fait_lab_tr
      WHERE ids_nda IN
          (SELECT ids_nda
           FROM sel)
      ORDER BY dt_fait) AS labo
   GROUP BY ids_nda),
      rum AS
  ( SELECT ids_nda,
           json_agg(rum) AS rumo,
           count(1) AS total
   FROM
     ( SELECT ids_nda,
              json_build_object( 'cd_rum',cd_rum, 'dt_deb_rum',
dt_deb_rum, 'dt_fin_rum', dt_fin_rum, 'diag',
json_build_object('total',diag.total,'diag',diag.diago), 'act',
json_build_object('total',act.total,'act',act.acto) ) AS rum
      FROM eds.nda_rum_tr
      LEFT JOIN diag USING (ids_nda_rum)
      LEFT JOIN act USING (ids_nda_rum)
      WHERE ids_nda IN
          (SELECT ids_nda
           FROM sel)
        AND cd_rum = 'RUM' ) AS rumo
   GROUP BY ids_nda),
      rss AS
  ( SELECT ids_nda,
           json_agg(rss) AS rsso,
           count(1) AS total
   FROM
     ( SELECT ids_nda,
              json_build_object( 'cd_rum',cd_rum, 'dt_deb_rss',
dt_deb_rum, 'dt_fin_rss', dt_fin_rum, 'ghm',
json_build_object('total',ghm.total,'ghm',ghm.ghmo), 'rum',
json_build_object('total',rum.total, 'rum',rum.rumo) ) AS rss
      FROM eds.nda_rum_tr
      LEFT JOIN ghm USING (ids_nda_rum)
      LEFT JOIN rum USING (ids_nda)
      WHERE ids_nda IN
          (SELECT ids_nda
           FROM sel)
        AND cd_rum = 'RSS' ) AS rss
   GROUP BY ids_nda),
      enc AS
  (SELECT 'Encounter' AS "resourceType",
          cd_nda AS "identifier",
          duree_hospit AS "length",
          lib_statut_nda_tr AS "status",
          lib_type_nda_tr AS "type",
          ids_pat,
          json_build_object('start', dt_deb_nda,'end', dt_fin_nda) AS
"appointment",
          json_build_object('total',lab.total, 'lab',lab.labo) AS lab,
          json_build_object('total',rss.total, 'rss',rss.rsso) AS rss
   FROM eds.nda_tr
   LEFT JOIN lab USING (ids_nda)
   LEFT JOIN rss USING (ids_nda)
   WHERE ids_nda IN
       (SELECT ids_nda
        FROM sel)
   ORDER BY dt_deb_nda ASC)
SELECT 'Bundle' AS "resourceType",
       count(1) AS total,
       array_to_json(array_agg(ROW)) AS encounter
FROM
  (SELECT 'Patient' AS "resourceType",
          ipp AS "identifier",
          nom AS "name",
          cd_sex_tr AS "gender",
          dt_nais AS "birthDate",
          json_build_array(enc.*) AS encounters
   FROM eds.patient_tr
   INNER JOIN enc USING (ids_pat) ) ROW;

Reply via email to