Dla każdej instrukcji insert widzę sp_executesql w SQL Server Profiler


4

Pracując nad dostrajaniem naszej bazy danych i zapytaniami o jeden z naszych produktów, postanowiłem otworzyć program Profiler w środowisku QA i zobaczyć, co on pokazuje.

Widziałem dla każdej wywołanej przeze mnie wstawki wywołanie sp_executesql z tekstem instrukcji insert.

To wydaje się być wielkim hitem, czy istnieje sposób, aby to wyłączyć?

Środowisko:

  • SQL Server 2008 R2 Standard
  • Windows Server 2008 R2 Enterprise
  • 32 GB pamięci RAM
  • 2x4 Xeon
9

Nie martwiłbym się zbytnio.

Chodzi o sparametryzowanie oświadczeń do ponownego wykorzystania.To znaczy unikaj kompilacji

Weź pod uwagę, że masz 3 różnych klientów uruchamiających 3 oddzielne oświadczenia:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

Każdy z nich ma inny tekst, dlatego zostanie skompilowany do innego planu.Oznacza to, że 3 kompiluje i 3 plany w pamięci podręcznej.

Teraz te 3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42'

Plan wielokrotnego użytku tutaj jest dla oświadczenia SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 więc masz jeden plan to cache.

W zajętych systemach ten czas kompilacji ma znaczenie.Większość zapytań jest bardziej złożona niż oczywiście: często można to zobaczyć w przypadku pierwszego uruchomienia w porównaniu z kolejnymi czasami uruchomienia (patrz Testing Query Speed)

Również w złożonych i zajętych systemach rozmiar pamięci podręcznej planu może być ograniczony lub zabiera pamięć RAM z pamięci podręcznej danych (puli buforów), co również może przeszkadzać.Ekstremalne może być 10000 planów lub jeden zajętej aplikacji internetowej.(Efekt zależy od subtelności 32 vs 64 bitów)

Niektóre ORM i sterowniki pozwalają ci to wyłączyć, zazwyczaj „przygotowane instrukcje” lub jakąś opcję: ale ostrzegaj, że może to spowolnić.Powiedziałeś, że „to wydaje się wielkim hitem”, co oznacza, że ​​obawiasz się obciążenia ...

+2

Świetne wyjaśnienie * dlaczego * niektóre systemy to robią.Pozwala im sparametryzować ich SQL bez użycia procedur przechowywanych. 15 wrz. 112011-09-15 19:06:11


4

Nie jestem pewien, czy rozumiem, chcesz przestać używać sp_executesql?Jeśli tak, wystarczy zmienić kod, aby nie używać tej metody.Wierzę, że obiekt SQLCommand w .NET użyje sp_executsql, więc jeśli używasz .NET, powinieneś zobaczyć to wywołanie.


5

Jeśli używasz większości ORM (Link2SQL, EF itp.), Powodują, że ta urocza mała metoda jest używana.Jeśli piszesz sparametryzowaną instrukcję wstawiania, to również przejdzie w tej metodzie.

  0

Więc nie mogę obejść tego za pomocą sparametryzowanych wstawek?Jak ... w ogóle? 15 wrz. 112011-09-15 13:05:38

  0

Nie.Jedyną opcją byłoby użycie własnej procedury przechowywanej. 15 wrz. 112011-09-15 17:19:53