Archive for March, 2014

Random értékek + Clustered index = vinyó tengelytörés

Monday, March 31st, 2014

Az utóbbi hónapban két munkámban is random kulcsok okoztak kalamajkát az SQL Serverek és a megrendelők életében. Az egyik esetben egy adattárház betöltését lassította le a NEWID()-val generált véletlenszám, a másikban Java-ban generáltak véletlen kulcsokat, amitől az összes adatot érintő művelet belassult.
Az elsőben annyira, hogy a normál esetben 250000 sor/sec-es bulk insert lelassult pár 10 sor/secre, és a merevlemezek válaszideje felment pár másodpercre (normál esetben ez pár millisec).
A táblák annyira fragmentáltak voltak, hogy a nagyobbakon fragmentáltság mértéke 99,7% volt, 10 fölött már simán defragmentálni szoktunk.
Nonclustered indexek esetén is érezteti a hatását a guid, de nem annyira agresszíven, mint a clu index esetén.
Bármennyire is kényelmes az a tény, hogy guidokat adatbázison kívül is lehet generálni, meg kell gondolni a használatukat. Az identity nem OR mapper barát, mivel minden egyes sor beszúrása után vissza kell olvasni a generált identity értéket, azaz minden egyes insert egy round trip lesz. Jó megoldás lehet a HILO primary key generálás, kölönösen SEQUENCE alapon, de ezt meg nem támogatja minden OR mapper (EF se, itt van egyféle külső implementáció hozzá).
Nem egyszerű jó kulcsgenerátort találni.

Test Driven Development tanfolyam – fogynak a helyek, jelentkezzen, aki még be szeretne beférni májusban.

Meghalt a Pex, éljen a Code Digger!

Friday, March 28th, 2014

Van/volt a Microsoft Research-nek egy Pex nevű kis Visual Studio Extensionje. Automatikusan képes volt Unit teszteket generálni. Nem egyszerűen permutálta egy tesztelendő metódus paramétereit, hanem belenézett a kódjukba, kihalászta belőle a literálokat (a == 3, case “alma”, b *= 4, ezekből a 3, 4 és amát), és ezeket is felhasználva generált paramétereket a teszteléshez. Miközben futtatta a tesztelt kódot, közben profilerrel nézte mely ágakat fedte le, így addig próbálta nyúzni a kódot, míg 100%-os lefedettséget nem ért el. Null és üres string ellenőrzési hiányosságokat, túlcsordulásokat és tömb túlcímzéseket másodpercek alatt ki tudott váltani. A generált unit teszteket aztán át lehetett mozgatni a saját tesztjeink közé.
No, sajnos a Pex egyelőre meghalt, a cimboráját, a Moles-s termékesítették, ez lett a Fakes, de ő kimaradt ebből a menetből. Így ő csak VS 2010-ben futtatható, újabbakban nem.

Cserébe viszont most kiadtak egy “Pex light”-ot, ez a Code Digger.

Ugyanaz az engine van benne, mint a Pexben, csak nem generál a metódus macerálás végén unit teszteket, csak megmutatja, melyik paraméterre mit reagált.

Egy-egy kényesebb metódusra érdemes lefuttatni, tanulságos lehet.

TDD tanfolyam

OzCode

Wednesday, March 26th, 2014

Mátyás Gergely hívta fel a figyelmem az OzCode nevű kis debugger ketyerére (utólag is köszönöm neki).

Az OzCode egy (egyelőre ingyenes) kis VS kiegészítés, ami a debuggert okosítja fel. Hogy miket tud nem írom le tételesen, a honlapján szépen összeszedték.

Amire nekem most jó volt. Elszállt az adatbázisba mentő kód.
Additional information: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 59 (“@p56”): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.
OR mapper generálta az insertet, így nem tudtam, mi az 56. paraméter. A Hiberna belső batch-elője szállt el, amiben a jófene tudja hol vannak a commandok és a paraméterek.
Sebaj, itt jön az OzCode. A referenciára ráállva rákerestettem a @p56-ra, erre végigkeresi az ojjektumból kiindulva a referenciákat, és meg is találta benne:

Nem csak a memberök nevére keres, hanem a változók tartalmára is, a @p56 is egy insert string belsejében volt!
Az insertet megnézve látszott, hogy ez a Fitness nevű propertyre képződik le. Feljebb menve a stacken ismét kerestettem egyet:

Gyönyörűen látszik, hogy NaN a double property értéke, ez nem tetszett az SQL Servernek, ő nem tud ilyet ábrázolni.

Barátunk az OzCode.

TDD tanfolyam

Test Driven Development tanfolyam indul

Tuesday, March 25th, 2014

Nagy örömmel jelentem, hogy sikerült megszervezni a tanfolyamot oktatótermi keretek között is. Részletek itt találhatók.

Szeretettel várok mindenkit.

Auto property breakpoint

Friday, March 21st, 2014

Ismerős a trükk?

“Another workaround instead of rewriting the property is to set the breakpoint by function name. Please open the Breakpoints window from Debug / Windows / Breakpoints menu. Click New / Break at Function. In the Function field, fill .set|get_. For example: MyNamespace.MyType.get_MyProperty.”

Forrás.

SQL Server magas CPU használat nyomozás és megoldás

Wednesday, March 19th, 2014

Az utóbbi hetekben szinte minden nap SQL Servert hegesztek valahol. Leírom az összes eset tanulságát, lássuk a legutóbbit.
Adott egy igen magas forgalmú SQL Server, 1000 batch/sec körüli a terhelése. A lekérdezések derekasan optimalizálva voltak a megrendelő által, másképp nem is bírta volna produkálni a szerver ezt az áteresztő képességet (de gáz ez a szó, nem egy intim betétről írok).
A lassú lekérdezések listájában volt egy gyanúsan egyszerű, de rengetegszer meghívott lekérdezés. Ez nem volt indokolt, ezért ezt most már csak egyszer hívják meg a kliensben, aztán eltárolják az eredményét. Ezt jó észben tartani, hiába 2 lapolvasásos, seekes egy kveri, ha nagyon sokszor hívják meg, le tudja ez is fogni a szervert.
Tovább nézve látszott, hogy egy olyan trigger belseje vitte el az időt, amit még én javasoltam nekik 1-2 éve. :) A trigger feladata eladásoknál módosítani a készletet, így nem kell szummákkal kiszámítani listázáskor az aktuális készletet. Denormalizált adatokat frissített. Ezzel azt lehet majd tenni, hogy a forrástábla nem minden oszlopa módosítja a készletet, így egy IF UPDATE(…)-tel le lehet majd csökkenteni a számítások számát.
A következő pont a recompile-ésönök vizsgálata volt. A legtöbb lekérdezés ad-hoc queryként ment be, a procedure cache kihasználása gyenge volt, 60% körüli. Mivel a hibajelenség a nagy CPU terhelés volt, gyanús volt, hogy a sok fordítás-tervgenerálás eszi a procikat (8 mag, 16 logikai proc 90%-on).
A lekérdezéseket megvizsgálva kiderült a gyenge cache reuse oka: a batch-ek elejére kommentek voltak írva, amelyek kliensenként egyediek voltak. Így ugyanaz az ad-hoc query sok százféle verzióban is bement a szerverre, ami így nem tudta hatékonyan cachelni.
A kommenteket kivéve a plan reuse felment 90% fölé. :)
A harmadik dolog még egy update statistics with fullscan volt. A statisztikák rendkívül fontosak az SQL Server működéséhez, aki nem hallott még róla olvasson utána, megéri. Normál esetben, nagy tábláknál csak mintavételezve frissíti a statisztikákat a szerver, érthető módon spórolva az erőforrásokkal. Viszont egyenetlen eloszlású oszlopok esetén ez rossz hisztogramokat eredményezhet, ami miatt rossz tervet fog generálni a szerver. Ezen segíthet, ha időnként futtatunk full scanes update statisticset is. Például hétvégenként. Erre van egy nagyszerű kis sql csomag, hamarosan írok róla.

Zárásként tanulságul, az SQL kommentek messze nem olyan kis ártatlan teremtések, mint gondolnánk.

Update: az elfelejtettem leírni, hogy az eredeti 90%-ról lement 50%-ra a procihasználat.

Test Driven Development tanfolyam

Thursday, March 6th, 2014

Előadtam a 4 napos Test Driven Development tanfolyamomat 2 nagy csapatnak is egy híres nemzetközi-magyar cégnél. Úgy tűnt sikerült fellelkesíteni a kollégákat, ez a célja egy ilyen oktatásnak. Nagyon jó olyan helyen oktatni, ahol értenek a szakmához és szeretik is azt.
A 4. nap mindig egy egész napos demó, ahol a nulláról összerakunk egy SQL Server és Active Directory között szinkronizáló alkalmazást (fake adapterekkel), TDD módon, sokat refactorolva közben.

Gondolkodom rajta, hogy megnyitom a tanfolyamot nem csak cégeknek, hanem tantermi jelleggel is, így azok a cégek programozói is élvezhetik, akiknek nincs annyi emberük, hogy házon belül rendezzék meg a tanfolyamot.

Ha valakit érdekelne a dolog, kérdem jelezze kommentben vagy emailben, hogy lássam, érdemes-e nekiállni kibérelni egy termet erre a célra.

Témák:
1. Unit tesztelés bevezető
2. Unit tesztelés elmélet
3. Függőségek kiiktatása Fake-ekkel
4. Refactoring
5. Test Driven Development (TDD)

Kulcsszavak a tanfolyamból:
Refactoring
Resharper
NCrunch
Visual Studio 2013
TDD
Triangulation
Unit Test
NSubstitute
Mock
Stub
Visual Studio Fakes
Dependency Injection
AutoFac
Unity
Design Patterns
Code Quality
Design elvek alkalmazása
Code Smells
Integrációs tesztek
FluentAssertions
Cyclomatic Complexity
Code Coverage
Conformance, Ordering, Range, Reference, Existence, Cardinality,Time
Unit Testing antipatterns