Query optimizálás 2 – UDF

Nem fogom mindig számozni, ha ugyanarról a témáról lesz szó, de ez szerves folytatása az előző ugyanilyen címűnek.

Szóval első lépésben kicsit tuningoltam a lekérdezésen a joinokkal operálva.

Most pedig kiszedtem belőle a user defined function-öket. Hogy miért? Mert ha van egy lekérdezésünk, és annak négy oszlopát is UDF-ök állítják elő, amik semmi mást nem csinálnak, csak számolgatnak, az nem jó.

A UDF-t sajnos a query optimizer nem tudja értelmezni, így békén hagyja. Ennek eredményeképpen ha a lekérdezésünk 30 ezer sort ad vissza, akkor azon a végtelen sok soron szépen egyenként végigmászik és kiértékeli az adott oszlopot, ahol UDF-t talál.

30 ezer sor, 4 UDF soronként, azt plusz 120 ezer művelet.

Tudom, nagyon szép, hogy külön egységbe rendezünk egy-egy kóddarabkát, és ha mondjuk csak egy sort kérdezünk le mindig, akkor nem is igen érdekel, hogy pár ezred- vagy századmásodperccel gyorsabb is lehetne.

De ha kiszedem az UDF-öket, vagyis helyesebben helyben beteszem a lényegüket, hogy a számolgatás, case és hasonlók magában a query-ben legyenek, akkor ez felgyorsítható. Mivel így már rálát a query optimizer, nem kell minden soron átmennie, vidáman dolgozik azzal, amit lát.

Esetemben a 30 ezer sornál már érdekel, mert itt konkrétan 10 másodperc helyett 3 másodperc alatt jött le. Ezen nem lehet csak úgy túllendülni, hogy jó ez faluhelyen.

Sajnos a kinézet kicsit rondább lett, az amúgy sem túl szép lekérdezés még egy lépést tett a káosz felé, viszont az eredeti 15-20 másodperces átlagról leszorítottam 3-4 környékére. Ennyiért már megérte.