Túlcsordulás... Vajon 10 OLAP tanácsadóból hány futott már bele?

Jelenleg egy adattárházat auditálok és sok minden más tesztelése mellett leellenőrzöm azt is, hogy helyesen lettek-e megválasztva az OLAP kockák measure-einek adattípusai.

A measures-ök adattípusának helyes megválasztása egyrészről a teljesítmény szempontjából fontos, - de erről már érintőlegesen beszéltem a legutolsó Technet szemináriumon - másrészről, ha túl kicsinek választjuk meg őket, akkor túlcsordulhatnak.

Mutatok egy példát. Tegyük fel, hogy a fact táblánk Measure oszlopa int típusú és két sort tartalmaz:

  • 1. sor: 2147483647 (Az int felső határa)
  • 2. sor: 1

A kocka felösszegzése után azt várnánk, hogy a kockában megjelenő totál összeg 2147483648 lesz. Ehelyett a kockában azt fogjuk látni, hogy mínusz 2147483549.

Hogyan lehetséges mindez? Úgy hogy az OLAP kockánk measure-ének adattípusát a ténytábla adattípusa után int-nek deklaráltuk és a measure egész egyszerűen túlcsordult.

Mutatom máshogy. Képzeljük el, hogy a ténytábla 2 sort tartalmaz:

  • 1. Sor: 2 milliárd
  • 2. Sor: 2 milliárd

Felösszegzés után 4 milliárdot várnánk, de ehelyett kb. -295 milliót kapunk. Az történ ugyanis, hogy a 4 milliárdból belerakott az Analysis Services az Int mezőbe annyit amennyit bírt (2147483647-et) majd a maradékot folytatta az int alsó határától: -2147483647-tól. így kaptunk -294967196-ot.

Megoldás: Az OLAP kockák measure-einek adattípusát nem a ténytábla adattípusa szerint kell megválasztanunk, hanem az alapján, hogy mekkora értékek lesznek benne felösszegzés után! Esetünkben, ha int helyett bigint-nek választottuk volna a measures adattípusát, akkor a helyes 4 milliárdos értéket kaptuk volna. A ténytábla adattípusa tehát csak a legkisebb választható adattípust jelöli ki!

Hogy ellenőrizhetjük, hogy helyesen lettek megválasztva az adattípusok?

Kezdjük a legegyszerűbb esettel: measure-ünk

  • Sum felösszegzési mód szerint legyen felösszegezve és
  • minden dimenziója tartalmazza az All elemet és
  • a measure-ön ne legyen definiálva MeasureExpression

Ebben az esetben a "Select Sum(Measure) from Ténytábla" SQL Select eredményeképp kapott összeget (illetve a néhány év múlva nagy valószínűséggel elért összeget) kell figyelembe venni a legkisebbnek választható adattípus meghatározásához.

Ha measure-ünk nem minden dimenziója tartalmaz [All] elemet, mint például az idő dimenzió, amelyen nincs az évek összegét mutató [All] elem, akkor itt évenként kell meghatározni az összeget, és azt kell megnézni, hogy az így kapott összeg belefér-e az adattípusba.

A fentiek mintája alapján meghatározható a nem sum szerint felösszegzett measure-ök legkisebb adattípusa is (pl.: Semi-addittive measure-ök.)

Ha measure-ünkre definiáltunk MeasureExpression-öket, akkor értelem szerűen nem a fact táblában szereplő összegeket kell figyelembe venni a legkisebb adattípus meghatározásakor, hanem a MeasureExpression eredményeképp előálló összegeket. Szintén, ha az MDX script-ben definiál valamilyen aggregációt, akkor előfordulhat, hogy a fenti módszerekkel meghatározott adattípus kevésnek bizonyul.

Összefoglalva: Mindig fordítson időt a measure-ök adattípusának helyes megválasztására. Ha fölülméretezi őket az csak a teljesítmény rovására megy, de ha alul, akkor az már adathibát eredményez!

Kővári Attila - BI projekt

Új hozzászólás