konto usunięte
Temat: Szybkość procedury vs. adhoc query
Zamieszczam obiecany dowód.Potrzebna jest baza AdventureWorksLT2008, projekt w VS2010. Oto kod w C# tworzący zapytanie, cały projekt zamieściłem tutaj:
const string CONN_STR = @"Data Source=.;Initial Catalog=AdventureWorksLT2008;Integrated Security=True";
static void Main() {
string[] _filters = { "Red","Blue","Yellow" };
//AdventureWorksDataContext został wygenerowany w dbmlu
using(var db = new Linq2SQL.AdventureWorksDataContext(CONN_STR)) {
db.Log = Console.Out;
foreach(string _filter in _filters) {
db.Products //from SalesLT.Products
.Where(p => p.Name.Contains(_filter)) //where Name like '%filter%'
.Select(p => new { p.Name,p.Color }) //select Name,Color
.ToList(); //execute
}
}
}
a oto zapytanie SQL które odpytuje cache query planów - zwracam uwagę na kolumnę usecounts gdyż to jej licznik ma kluczowe znaczenie dla dowodu, czy plan jest używany
select p.usecounts, t.[text]
from sys.dm_exec_cached_plans p
cross apply sys.dm_exec_sql_text(plan_handle) t
where text LIKE N'%![SalesLT!].![Product!] AS ![t0!]%' escape '!' and text not like N'%dm_exec_cached_plans%';
no i jeszcze komenda do czyszczenia cache'u:
DBCC FREEPROCCACHE;- warto przeczyścić przed startem testu.
DBCC FREESYSTEMCACHE('ALL');
W .NET 4.0 wszystko używa tego samego planu, bo Linq parametryzuje parametr jako nvarchar(4000), w 3.5 było (i jest) trochę gorzej, bo... sami zobaczcie jak Linq parametryzuje stałe, wspominałem o tym jakiś czas temu w polemice z Przemkiem - jakoś nikt poza mną się tym nie zmartwił i nie opisał, jak to jest w innych ORMach:)
Zachęcam do samodzielnego grzebania zarówno we wnętrzościach SQL Servera (np. sys.dm_exec_cached_plans) jak i innych ORMach, Linq2SQL jest dość młody i jak widać dojrzewa. W sieci często są już nieaktualne informacje na jego temat.
Na koniec moje zdanie: nawet, gdyby kiedyś ilość query planów była dla nas problemem to:
- koszt produkcji softu bez ORMa: dość duży
- kostka pamięci RAM i/lub konsultacja dobrego DBA w kwestii tuningu instancji produkcyjnego SQL Servera: niski
Mówię to z punktu widzenia osoby, która i soft tworzy od zera, i martwi się potem jak on działa już po wdrożeniu. Gdybym był tylko DBA to oczywiście ORMów bym zakazał, podobnie jak każdy admin zakazałby luserom dostępu do sieci:)