Tema: Re: Idomumo delei: kodel ADO komanda letesne?
Autorius: G.
Data: 2010-05-10 21:17:29
O koks yra MasterUUID  stulpelio tipas duombazėje - uniqueidentifier ar koks
(n)varchar? Gal SQL serveris gaišta laiką konvertuodas visus 
uniqueidentifier į
stringus (ar nvarchar į varchar)?
Geriausia būtų sql profiler'į pasileisti ir pažiūrėti kaip tas SQL atrodo ir
pabandyti tuos sql  statement'us paleisti iš Managment Studio. Gal  SQL 
serveris turi blogus planus toms parametrizuotoms uzklausoms is ADO.NET 
užsikešavęs.

Kitas dalykas, gal kiek mažiau tikėtinas, - ADO.NET defaultinis transakcijos 
isolation level yra serializable, o Management Studio query lange 
tikriausiai kitoks. Gal tai
irgi gali turėti įtakos? Gal ir kiti connetion settingai skiriasi 
(ARITHABORT)?

..Dėl .NET distributed transakcijų - jei dirbama tik su vienu SQL serveriu
tai distributed tranzakcijos nenaudojamos, jei tranzakcija susideda iš
keleto resursų (SQL, messsage queues ir t.t.) tada bus naudojamas DTS, kuris
yra kiek lėtesnis nei lokali tranzakcija. Bet tikrai ne taip stipriai
lėtesnis kaip tavo pavyzdyje.

Šiaip tai įdomu kodėl taip keistai gaunasi, bet manau, kad problema bus 
labiau SQL serverio pusėje,

G.V.


"Meff" <noemail@japan.cc> wrote in message
news:hs9agt$qek$1@trimpas.omnitel.net...
> Sveiki. Įdomumo dėlei (M$ nelabai kažką radau, o StackOverflow aiškina
> apie konvertavimą į konkretų parametro tipą).
> Yra tokia SQL komanda
>
> DELETE FROM Detail WHERE MasterUUID =
> '8d66bfb5-f638-4e30-ac27-328078122122'
>
> šita komanda suveikia per < 1 sekundę, jei leidžiama iš Management Studio.
> O jei leidžiama per .Net kodą:
>
> SqlCommand cmd = new SqlCommand(string.Format("DELETE FROM Detail WHERE
> MasterUUID = '{0}'", masterUUID));
>
> ji suveikia per ~20 sekundžių
> Tačiau jei ji yra va tokia:
>
> SqlCommand cmd = new SqlCommand(string.Format("DELETE FROM Detail WHERE
> MasterUUID = @MasterUUID");
> SqlParameter masterUUIDParameter = new SqlParameter("MasterUUID",
> masterUUID);
> cmd.Parameters.Add(masterUUIDParameter);
>
> arba parametras pagaminamas taip:
>
> SqlParameter masterUUIDParameter = new SqlParameter("MasterUUID",
> DBType.Uniqueidentifier);
> masterUUIDParameter.Value = masterUUID;
>
> (konstruktoriuje nurodomas patametro tipas)
> tada ta pati komanda vykdoma ~2 minutes...
> Kaip manot, ką .Net'as padaro ir kaip tokių nesąmonių išvengti? Jau ne
> pirmą kartą su tokia nesąmone susiduriu. Ypač aktualu, kai trinami dideli
> duomenų kiekiai.
>
> Indeksas ant MasterUUID kažkiek padeda, bet proporcijos vis tiek išlieka
> tos pačios.
>
> .Net 2.0