Egy táblára készítettem 3 triggert (külön UPDATE, INSERT, DELETE), mert azt akartam mérni, hogy pl. hány darab UPDATE fut le a táblán egy bizonyos időben. Ezt csak egy teszt szerveren tudom megcsinálni, mert az éles szerver (SQL Enterprise Edition) nagyon érzékeny. A mérést úgy szerettem volna elvégezni, hogy a teszt szerverre (SQL Developer Edition) visszatöltök egy mentést és az élesről felvett trace-t visszajátszom a teszten. Ez elsőre jó ötletnek tűnt, azonban meglepődtem, hogy a visszajátszás, nem módosít az adatokon!! Készítettem egy olyan trace-t, amelyen csak 5 művelet van 4 INSERT, 1 UPDATE. Ezek adatmódosításai azonnal látszanak a táblán és az én triggereim is elvégzik a dolgukat (megszámolják a műveleteket). Azonban amikor a nagy kb 1 órás tracet futtatom, semmi nem történik.
A következőket tettem:
Performance monitorral vizsgáltam a szervert a Batch requests/sec számláló pontosan azt az értéket mutatja ami az élesen is van (kb. 400-500 között)
A connection-ök száma is az éles szerverrel azonos (kb 700-800)
Próbáltam a trace replay-t is trace-elni (). A lekérdezések beérkeznek a szerverre, jó sok INSERT meg UPDATE a táblámba is, de a végén és közben sem, az adatok nem jelennek meg. Természetesen a trigger sem fut le.
Készítettem .NET-ben egy saját kis programot, amely a trace file-t "visszajátsza" a szerverre. Semmi. De ha csak azt a pár soros tracet (azzal az 5 lekérdezéssel) futtatom le, az működik az én programommal is.
Megpróbáltam, azt is, hogy készítek egy olyan trace táblát, amelyben csak a Batch Completed események vannak és abból is csak az adott táblára vonatkozók és azok közül is csak az INSERT INTO-k, majd a céltáblából kitöröltem minden rekordot és elindítottam a trace visszajátszását (a saját programommal, mert ezt a Profilerrel már nem lehet). Így persze működik minden
Vajon mi lehet a probléma? Az 1 órás trace sorainak szám kb. 1,5 millió. Másodpercenként 400-500 kérés érjezik be 800 connection-on keresztül. Valamit rosszul csinálok?