Overal wordt terecht gepushed richting geparametriseerde queries i.v.m. SQL injection en ook query performance, en bij .NET en MSSQL kom je dan al gauw uit bij SqlCommand.Parameters.AddWithValue(parameter, waarde).
Mooi, en werkt ook goed, maar i.c.m. MSSQL blijkt dit bij string parameters nogal slecht te performen. De meeste string columns in MSSQL databases zijn nog steeds ANSIString, en geen Unicode, en AddWithValue() gaat bij .NET strings default uit van Unicode. En de conversie die MSSQL 2005 (nog niet getest bij 2008) dan moet doen blijkt erg duur te zijn.
Door i.p.v. AddWithValue() bij strings zelf een SqlParameter aan te maken, z'n DbType op AnsiString te zetten, en z'n ParameterName en Value te zetten (en 'm daarna natuurlijk aan Parameters te adden) konden wij bij ettelijke queries meer dan 10x aan performance winnen.
Blijkbaar vooral omdat MSSQL veel beter met z'n nonclustered idexes om kan gaan wanneer de parameter in 't zelfde formaat is als de column.
Voorbeeldje: met een nvarchar(8) (=unicode) parameter 150 page reads, met een varchar(8) (=ansi) 11 page reads. Terwijl de data niet varieerden en de indexen (voor ansi) gewoon 100% klopten.
Mooi, en werkt ook goed, maar i.c.m. MSSQL blijkt dit bij string parameters nogal slecht te performen. De meeste string columns in MSSQL databases zijn nog steeds ANSIString, en geen Unicode, en AddWithValue() gaat bij .NET strings default uit van Unicode. En de conversie die MSSQL 2005 (nog niet getest bij 2008) dan moet doen blijkt erg duur te zijn.
Door i.p.v. AddWithValue() bij strings zelf een SqlParameter aan te maken, z'n DbType op AnsiString te zetten, en z'n ParameterName en Value te zetten (en 'm daarna natuurlijk aan Parameters te adden) konden wij bij ettelijke queries meer dan 10x aan performance winnen.
Blijkbaar vooral omdat MSSQL veel beter met z'n nonclustered idexes om kan gaan wanneer de parameter in 't zelfde formaat is als de column.
Voorbeeldje: met een nvarchar(8) (=unicode) parameter 150 page reads, met een varchar(8) (=ansi) 11 page reads. Terwijl de data niet varieerden en de indexen (voor ansi) gewoon 100% klopten.