ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ETL процСси Π² малък склад Π·Π° Π΄Π°Π½Π½ΠΈ

Много ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ спСциализирани инструмСнти Π·Π° създаванС Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅, трансформиранС ΠΈ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ. ΠŸΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ инструмСнти сС рСгистрира, Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ сС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚.

Π’ случай Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°, Π»ΠΎΠ³ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° информация, Ρ‡Π΅ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π½Π΅ Π΅ успял Π΄Π° изпълни Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ (чСсто java) къдС са спрСли. Π’ послСднитС Ρ€Π΅Π΄ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΊΠ»ΡŽΡ‡ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π—Π° Π΄Π° отговоря Π½Π° Π²ΡŠΠΏΡ€ΠΎΡΠ° ΠΊΠ°ΠΊΠ²Π° роля ΠΈΠ³Ρ€Π°Π΅ информацията Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π² ETL, класифицирах всички ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, възникнали ΠΏΡ€Π΅Π· послСднитС Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π² доста голямо Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ETL процСси Π² малък склад Π·Π° Π΄Π°Π½Π½ΠΈ

Π“Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ място, Π·Π°Π³ΡƒΠ±Π΅Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°, ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ Π½Π° сСсията ΠΈ Π΄Ρ€.

ЛогичСскитС Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, липса Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Π΄Ρ€.
ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‡ΠΈΠΊΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ стартира Π½Π°Π²Ρ€Π΅ΠΌΠ΅, Π΄Π° Π·Π°ΠΌΡ€ΡŠΠ·Π½Π΅ ΠΈ Ρ‚.Π½.

ΠŸΡ€ΠΎΡΡ‚ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π΅ ΠΎΡ‚Π½Π΅ΠΌΠ°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° отстраняванС. Π•Π΄ΠΈΠ½ Π΄ΠΎΠ±ΡŠΡ€ ETL ΠΌΠΎΠΆΠ΅ Π΄Π° сС справи с ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ тях сам.

Π‘Π»ΠΎΠΆΠ½ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π°Π»Π°Π³Π°Ρ‚ ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΈ тСстванСто Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½ΠΈ, изслСдванС Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ. ЧСсто водят Π΄ΠΎ нСобходимостта ΠΎΡ‚ тСстванС ΠΈ внСдряванС Π½Π° промяна.

Π’Π°ΠΊΠ° Ρ‡Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΎΡ‚ всички ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ. 48% ΠΎΡ‚ всички Π³Ρ€Π΅ΡˆΠΊΠΈ са прости Π³Ρ€Π΅ΡˆΠΊΠΈ.
Π•Π΄Π½Π° Ρ‚Ρ€Π΅Ρ‚Π° ΠΎΡ‚ всички ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с промяна Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° ΠΈΠ»ΠΈ ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ са слоТни.

И ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ Π΅Π΄Π½Π° Ρ‡Π΅Ρ‚Π²ΡŠΡ€Ρ‚ ΠΎΡ‚ всички ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‡ΠΈΠΊΠ° Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ, 18% ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ са прости Π³Ρ€Π΅ΡˆΠΊΠΈ.

ΠšΠ°Ρ‚ΠΎ цяло 22% ΠΎΡ‚ всички възникнали Π³Ρ€Π΅ΡˆΠΊΠΈ са слоТни ΠΈ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ изисква Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ Π²Ρ€Π΅ΠΌΠ΅. Π’Π΅ сС случват ΠΎΠΊΠΎΠ»ΠΎ вСднъТ сСдмично. Π”ΠΎΠΊΠ°Ρ‚ΠΎ прости Π³Ρ€Π΅ΡˆΠΊΠΈ сС случват ΠΏΠΎΡ‡Ρ‚ΠΈ всСки Π΄Π΅Π½.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ETL процСси Ρ‰Π΅ бъдС Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ мСстополоТСниСто Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° Π΅ посочСно Π² Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° възмоТно Π½Π°ΠΉ-Ρ‚ΠΎΡ‡Π½ΠΎ ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π•Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³

Какво исках Π΄Π° видя Π² процСса Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ETL?

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ETL процСси Π² малък склад Π·Π° Π΄Π°Π½Π½ΠΈ
Π—Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ ΠΎΡ‚ - ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚ΠΎΠΉ Π·Π°ΠΏΠΎΡ‡Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°,
Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ - ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ,
Π‘Π»ΠΎΠΉ - ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ сС Π·Π°Ρ€Π΅ΠΆΠ΄Π°,
ETL Job Name - ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π·Π° ΠΊΠ°Ρ‡Π²Π°Π½Π΅, която сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΊΠΈ ΡΡ‚ΡŠΠΏΠΊΠΈ,
НомСр Π½Π° ΡΡ‚ΡŠΠΏΠΊΠ° - Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Π½Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ°,
ЗасСгнати Ρ€Π΅Π΄ΠΎΠ²Π΅ - ΠΊΠΎΠ»ΠΊΠΎ Π΄Π°Π½Π½ΠΈ Π²Π΅Ρ‡Π΅ са ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ,
ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚ Π² сСкунди - ΠΊΠΎΠ»ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΎΡ‚Π½Π΅ΠΌΠ°,
Бтатус - Π΄Π°Π»ΠΈ всичко Π΅ Π½Π°Ρ€Π΅Π΄ ΠΈΠ»ΠΈ Π½Π΅: ОК, Π“Π Π•Π¨ΠšΠ, Π ΠΠ‘ΠžΠ’Π˜, Π—Π˜Π‘Π’Π
Π‘ΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ - послСдно ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ описаниС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°.

Π’ΡŠΠ· основа Π½Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° записитС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅ΠΉΠ». писмо Π΄ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ Ρ‡Π»Π΅Π½ΠΎΠ²Π΅. Ако няма Π³Ρ€Π΅ΡˆΠΊΠΈ, Ρ‚ΠΎΠ³Π°Π²Π° писмото Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½, Π² случай Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°, мястото Π½Π° ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π° Π΅ ясно посочСно.

Понякога сС случва самият инструмСнт Π·Π° наблюдСниС Π΄Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π’ Ρ‚ΠΎΠ·ΠΈ случай Π΅ възмоТно Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄ (ΠΈΠ·Π³Π»Π΅Π΄) Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, въз основа Π½Π° която сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ΡŠΡ‚.

ETL Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π° наблюдСниС

Π—Π° Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ETL процСси, са Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ Π΅Π΄Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈ Π΅Π΄ΠΈΠ½ ΠΈΠ·Π³Π»Π΅Π΄.

Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π²ΡŠΡ€Π½Π΅Ρ‚Π΅ към Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΌΠ°Π»ΠΊΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π² Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π½Π° sqlite.

DDL Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ

CREATE TABLE UTL_JOB_STATUS (
/* Table for logging of job execution log. Important that the job has the steps ETL_START and ETL_END or ETL_ERROR */
  UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  SID               INTEGER NOT NULL DEFAULT -1, /* Session Identificator. Unique for every Run of job */
  LOG_DT            INTEGER NOT NULL DEFAULT 0,  /* Date time */
  LOG_D             INTEGER NOT NULL DEFAULT 0,  /* Date */
  JOB_NAME          TEXT NOT NULL DEFAULT 'N/A', /* Job name like JOB_STG2DM_GEO */
  STEP_NAME         TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
  STEP_DESCR        TEXT,                        /* Description of task or error message */
  UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);

ΠŸΡ€Π΅Π³Π»Π΅Π΄/Π”ΠΎΠΊΠ»Π°Π΄Π²Π°Π½Π΅ Π½Π° DDL

CREATE VIEW IF NOT EXISTS UTL_JOB_STATUS_V
AS /* Content: Package Execution Log for last 3 Months. */
WITH SRC AS (
  SELECT LOG_D,
    LOG_DT,
    UTL_JOB_STATUS_ID,
    SID,
	CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' /* file transfer */
	     WHEN INSTR(JOB_NAME, 'STG') THEN 'STAGE' /* stage */
	     WHEN INSTR(JOB_NAME, 'CLS') THEN 'CLEANSING' /* cleansing */
	     WHEN INSTR(JOB_NAME, 'DIM') THEN 'DIMENSION' /* dimension */
	     WHEN INSTR(JOB_NAME, 'FCT') THEN 'FACT' /* fact */
		 WHEN INSTR(JOB_NAME, 'ETL') THEN 'STAGE-MART' /* data mart */
	     WHEN INSTR(JOB_NAME, 'RPT') THEN 'REPORT' /* report */
	     ELSE 'N/A' END AS LAYER,
	CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'ACCESS LOG' /* source */
	     WHEN INSTR(JOB_NAME, 'MASTER') THEN 'MASTER DATA' /* source */
	     WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* source */
	     ELSE 'N/A' END AS SOURCE,
    JOB_NAME,
    STEP_NAME,
    CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS START_FLAG,
    CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS END_FLAG,
    CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS ERROR_FLAG,
    STEP_NAME || ' : ' || STEP_DESCR AS STEP_LOG,
	SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS AFFECTED_ROWS
  FROM UTL_JOB_STATUS
  WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT JB.SID,
  JB.MIN_LOG_DT AS START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,
  JB.SOURCE,
  JB.LAYER,
  JB.JOB_NAME,
  CASE
  WHEN JB.ERROR_FLAG = 1 THEN 'ERROR'
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'HANGS' /* half an hour */
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 THEN 'RUNNING'
  ELSE 'OK'
  END AS STATUS,
  ERR.STEP_LOG     AS STEP_LOG,
  JB.CNT           AS STEP_CNT,
  JB.AFFECTED_ROWS AS AFFECTED_ROWS,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS JOB_START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS JOB_END_DT,
  JB.MAX_LOG_DT - JB.MIN_LOG_DT AS JOB_DURATION_SEC
FROM
  ( SELECT SID, SOURCE, LAYER, JOB_NAME,
           MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,
           MAX(START_FLAG)       AS START_FLAG,
           MAX(END_FLAG)         AS END_FLAG,
           MAX(ERROR_FLAG)       AS ERROR_FLAG,
           MIN(LOG_DT)           AS MIN_LOG_DT,
           MAX(LOG_DT)           AS MAX_LOG_DT,
           SUM(1)                AS CNT,
           SUM(IFNULL(AFFECTED_ROWS, 0)) AS AFFECTED_ROWS
    FROM SRC
    GROUP BY SID, SOURCE, LAYER, JOB_NAME
  ) JB,
  ( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
    FROM SRC
    WHERE 1 = 1
  ) ERR
WHERE 1 = 1
  AND JB.SID = ERR.SID
  AND JB.JOB_NAME = ERR.JOB_NAME
  AND JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDER BY JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;

SQL ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Π»ΠΈ Π΅ възмоТно Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Π½ΠΎΠ² Π½ΠΎΠΌΠ΅Ρ€ Π½Π° сСсия

SELECT SUM (
  CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* existed job finished */
	    AND NOT ( 'y' = 'n' ) /* force restart PARAMETER */
       THEN 1 ELSE 0
  END ) AS IS_RUNNING
  FROM
    ( SELECT 1 AS dummy FROM UTL_JOB_STATUS WHERE sid = -1) d_job
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID, 1 AS dummy
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
	    AND STEP_NAME = 'ETL_START'
      GROUP BY JOB_NAME, SID
    ) start_job /* starts */
  ON d_job.dummy = start_job.dummy
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG'  /* job name PARAMETER */
	    AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stop status */
      GROUP BY JOB_NAME, SID
    ) end_job /* ends */
  ON start_job.JOB_NAME = end_job.JOB_NAME
     AND start_job.SID = end_job.SID

Π₯арактСристики Π½Π° масата:

  • Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ ΠΈ краят Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ‚Π° Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ послСдвани ΠΎΡ‚ ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ ETL_START ΠΈ ETL_END
  • Π² случай Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° трябва Π΄Π° сС създадС ΡΡ‚ΡŠΠΏΠΊΠ°Ρ‚Π° ETL_ERROR с Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ описаниС
  • количСството ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ трябва Π΄Π° бъдС ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ със Π·Π²Π΅Π·Π΄ΠΈΡ‡ΠΊΠΈ
  • ΡΡŠΡ‰Π°Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС стартирана Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° force_restart=y, Π±Π΅Π· Π½Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° сСсията сС ΠΈΠ·Π΄Π°Π²Π° само Π½Π° Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°
  • Π² Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ

НСобходимитС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚Π°Π±Π»ΠΈΡ†Π° са слСднитС:

  • ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° сСсията Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Π½Π°Ρ‚Π° ETL ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°
  • Π²ΠΌΡŠΠΊΠ½Π΅Ρ‚Π΅ запис Π² ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°
  • ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° послСдния ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ запис Π½Π° ETL ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°

Π’ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ Oracle ΠΈΠ»ΠΈ Postgres Ρ‚Π΅Π·ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. sqlite изисква външСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ случай Ρ‚ΠΎΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° PHP.

ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡ

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² инструмСнтитС Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ играят ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π²Π°ΠΆΠ½Π° роля. Но Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° Π³ΠΈ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΈ Π·Π° Π±ΡŠΡ€Π·ΠΎ Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠšΠΎΠ³Π°Ρ‚ΠΎ броят Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈΡ‚Π΅ Π½Π°Π±Π»ΠΈΠΆΠΈ сто, Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΡŠΡ‚ Π½Π° процСса сС ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π² слоТСн ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Бтатията прСдоставя ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° възмоТно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ. ЦСлият ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° ΠΌΠ°Π»ΠΊΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π² gitlab ΠŸΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π·Π° SQLite PHP ETL.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€