Koop Officiele Publicaties kopieren naar een database

Voor uitgebreide analyses kan het wenselijk zijn om de volledige dataset van 6 miljoen bekendmakingen uit KOOP (NL) Officiele Publicaties naar een eigen database over te halen. Dit topic beschrijft een voorbeeld.

settings.xml

Online

Maak een database met twee datacontainers: de doeldatabase zoals SQL Server en KOOP (NL) Officiele Publicaties.

On-premises

Maak een settings*.xml-bestand in %USERPROFILE%\Invantive, bijvoorbeeld settings-koop.xml. Definieer hierin een database met twee datacontainers, bijvoorbeeld als:

<?xml version="1.0" encoding="utf-16"?>
<settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  VersionUpdateDate="2020-09-04T16:38:36.5624324Z"
  version="5">
  <group
    name="SAMPLE"
    id="4641e4ce-4049-406a-9959-bd405da7d5d0"
    sortingOrder="0"
  >
    <connection
      name="Sample"
      manual="true"
      authentication="Default"
      sortingOrder="20"
      id="2361f257-8a0e-4d7b-b234-8032abf91eff">
      <database
        order="10"
        comment="PostgreSQL"
        alias="oa"
        provider="PostgreSql"
        userLogonCodeMode="Hidden" 
        passwordMode="Hidden" 
        connectionString="Server=8.8.8.8;Database=sample;User Id=sample;Password=secret"
        AllowConnectionStringRewrite="false"
        />
      <database
        order="20"
        provider="KoopNlOfficielePublicaties"
        alias="op"
        userLogonCodeMode="Hidden"
        passwordMode="Hidden"
        AllowConnectionPooling="false" />
    </connection>
  </group>
</settings>

Doeltabel

Gebruik het volgende statement om een lege tabel met de gewenste structuur te maken:

create or replace table OAKoopOpEntries@oa
as
select *
from   Entries@op
where  false

Vervolgens worden per week van de wijzigingsdatum de bekendmakingen geladen:

set use-http-disk-cache@op true

set http-disk-cache-max-age-sec@op 2592000

begin
  for r
  in
  ( select day_date
    from   Calendar@DataDictionary
    where  day_date >= to_date('20140101', 'YYYYMMDD')
    and    day_date <= trunc(sysdateutc)
    and    DAY_IN_WEEK = 1
    order
    by     day_date
  )
  loop
    dbms_output.put_line('Load ' || to_char(r.day_date, 'YYYYMM') || '.');
    bulk insert into OAKoopOpEntries@oa
    select null rowid$
    ,      t.*
    from   Entries@op t
    where  t.Modified >= r.day_date
    and    t.Modified <  r.day_date + 7
    ;
    dbms_output.put_line('Processed ' || to_char(sqlrowcount) || ' rows.');
  end loop;
end;

Het laden duurt circa 24 uur voor de initiele laadactie.

Vervolgens kan gewisseld worden naar incrementeel laden voor alleen gewijzigde bekendmakingen op basis van Modified datum of de Events-tabel. Per dag is het datavolume circa 1.000 nieuwe bekendmakingen.

Toevoegen Externe Documenten

Het is mogelijk om ook externe documenten toe te voegen. Dit staat beschreven in Externe documenten opzoeken bij Officele Bekendmakingen.

De verwerkingsduur kan echter enorm zijn aangezien in principe voor elke bekendmaking twee HTTP-verzoeken nodig zijn:

  • een HTTP-verzoek nodig is om de lijst van externe bijlages op te vragen
  • een HTTP-verzoek om de lijst van eventuele documenten op te vragen

Zelfs bij een doorlopende verwerkingssnelheid van 32 HTTP-verzoeken per seconde duurt het minimaal 4 dagen voor de initiele laadactie.

De verwerkingsduur kan ingeperkt worden door deze opvragingen enkel te doen voor bepaalde vormen van bekendmakingen.

Vervolgens kan gewisseld worden naar incrementeel laden voor alleen gewijzigde bekendmakingen op basis van Modified datum of de Events-tabel. Per dag is het datavolume circa 1.000 nieuwe bekendmakingen, zodat er circa 2.000 HTTP-verzoeken nodig zijn om de documenten te achterhalen.

Het daadwerkelijk opvragen van de documenten zal in het algemeen beduidend sneller zijn. Ook momenteel worden aan relatief weinig bekendmakingen documenten toegevoegd, terwijl dit voorheen nog minder was.