pondělí 15. prosince 2008

Zkušenosti s vytvářením, používaním a výkonností vlastních ukazatelů

V následujícím příspěvku uvádím zkušenosti s vytvářením, používaním a výkonností vlastních ukazatelů (počítaných sloupců). Příspěvek navazuje na článek Dva způsoby jak definovat vlastní výpočty (ukazatele) v Business modelu.

Vlastní ukazatel (např. početní operace nad hodnotami dvou sloupců) lze definovat následujícími způsoby:
  1. Přímo při návrhu reportu
  2. Pomocí metadat použitím logických sloupců
  3. Pomocí metadat použitím fyzických sloupců

1. Při návrhu reportu
  • Jednoduché a rychlé nastavení
  • Vhodné při neopakovaném používání ukazatele (ukazatel je dostupný pouze v reportu kde je vytvořen)
  • Samotný výpočet je prováděn nad agregovanými nebo detailními ukazateli (záleží na tom zda výchozí ukazatel měl v metadata vrstvě přednastavenu agregační funkci)
  • Při nesprávném pochopení ukazatele z něhož se vychází a použití výpočetní funkce se může dojít k chybnému/nechtěnému výsledku (např. zprůměrovat již součtované ukazatele nebo viz. zde)
  • Doporučuji používat pouze v případě, kdy zdrojové sloupce jsou také obsahem reportu
  • V případě použití sloupců, které nejsou obsahem reportu má fyzický dotaz vysoký COST, který může narůst až o 6 řádů
  • Tento způsob využijí spíše koncoví uživatelé pro Ad-hoc potřebu


2. Pomocí metadat použitím logických sloupců
  • Výraz může odkazovat na sloupce/ukazatele v dané logické tabulce (i z více zdrojů)
  • Nejprve je prováděna agregace, a pak výpočet nového sloupce což může ovlivnit správnost / nesprávnost výsledků – více viz. zde
  • Pokud je odkazovaný sloupec obsahem reportu, tak je vše OK. Pokud není, pak fyzický dotaz má vysoký COST
  • Ukazatel je pojmenován a delegován až do prezentační vrstvy – je možné jej opakovaně používat

Ukázka výsledného dotazu:
WITH sawith0 AS
(SELECT DISTINCT t17101.is_on_us_flag AS c1, t1339.date_dt AS c2
FROM l1_owner.d_date t1339, l2_owner.a_stat_atm_agg t17101
WHERE (t1339.date_dt = t17101.audit_id)),
sawith1 AS
(SELECT SUM (t17101.amt_amt) AS c1, t1339.date_dt AS c2
FROM l1_owner.d_date t1339, l2_owner.a_stat_atm_agg t17101
WHERE (t1339.date_dt = t17101.audit_id)
GROUP BY t1339.date_dt)
SELECT DISTINCT CASE
WHEN sawith0.c2 IS NOT NULL
THEN sawith0.c2
WHEN sawith1.c2 IS NOT NULL
THEN sawith1.c2
END AS c1,
CASE
WHEN sawith0.c1 = '1'
THEN sawith1.c1
ELSE 0
END AS c2
FROM sawith0 FULL OUTER JOIN sawith1 ON sawith0.c2 = sawith1.c2
ORDER BY c1



3. Pomocí metadat použitím fyzických sloupců

  • Výraz může odkazovat na sloupce v připojených fyzických tabulkách (source)
  • Nejprve je prováděn výpočet, a pak agregace nového sloupce což může ovlivnit správnost / nesprávnost výsledků – více viz. zde
  • „Nepatrný“ COST fyzického dotazu a to ať jsou nebo nejsou zdrojové sloupce použity v reportu
  • Ukazatel je pojmenován a delegován až do prezentační vrstvy – je možné jej opakovaně používat

Ukázka výsledného dotazu:
SELECT t1339.date_dt AS c1,
SUM
(CASE
WHEN NOT t5199.resp_code_cd LIKE '00%'
THEN t17101.trn_cnt
ELSE 0
END
) AS c2
FROM l1_owner.d_date t1339,
lookup_owner.d_response_code t5199,
l2_owner.a_stat_atm_agg t17101
WHERE ( t1339.date_dt = t17101.audit_id
AND t5199.response_code_id = t17101.resp_cde_id
)
GROUP BY t1339.date_dt
ORDER BY c1



Závěr
Z výše uvedených informací vyplývá mé doporučení - pro definici vlastních ukazatelů používat v maximální míře fyzických sloupců:
  • Ukazatel je delegován až do prezentační vrstvy, takže jej lze opakovaně použít samotnými koncovými uživateli
  • Není limitováno dalším způsobem použití (viz koncové dotazy)
  • Nižší COST fyzického dotazu


Miroslav Petr (Adastra).

Žádné komentáře: