2011-05-25 8 views
6

Nasza aplikacja wysyła zapytanie SQL wygenerowane przez NHibernate. W środowisku wykonawczym aplikacji kwerenda trwa około 12 sekund, aby uruchomić bazę danych SQL Server. Program SQL Profiler pokazuje ponad 500 000 odczytów.To samo zapytanie SQL wolniejsze od aplikacji NHibernate niż SQL Studio?

Jednakże, jeśli przechwycę dokładny tekst zapytania za pomocą programu SQL Profiler i uruchomię go ponownie z SQL Studio, zajmie to 5 sekund i wyświetli mniej niż 4600 odczytów.

Kwerenda używa kilku parametrów, których wartości są podane na końcu tekstu SQL, a ja przeczytałem trochę o sniffingu parametrów i nieefektywnych planach zapytań, ale myślałem, że jest to związane z procedurami przechowywanymi. Być może NHibernate utrzymuje otwarty zestaw wyników, gdy tworzy instancje, co może wyjaśniać dłuższy czas trwania, ale co może wyjaśnić dodatkowe 494 000 "odczytów" dla tego samego zapytania, które wykonał NHibernate? (Brak dodatkowych zapytań w śladzie programu SQL Profiler.)

Kwerendę określa się jako kwerendę LINQ za pomocą obiektu LINQ NHibernate 3.1. Nie uwzględniłem samego zapytania, ponieważ wydaje się ono być podstawowym pytaniem o filozofię: co mogłoby wyjaśnić tak dramatyczną różnicę?

W przypadku, gdy jest to istotne, w wynikach pojawia się również kolumna varbinary (max), ale w naszej sytuacji zawsze zawiera ona wartość null.

Każdy wgląd jest bardzo cenny!

+3

Parametr wąchania dotyczy również AdHoc parametryzowane zapytania nie tylko procedur przechowywanych. Plany te są kompilowane zgodnie z pierwszym zbiorem parametrów i ponownie wykorzystywane do kolejnych wywołań z możliwymi wartościami parametrów. –

+1

Czy kiedykolwiek odkryłeś problem? Wpadam na to samo, a wszystkie moje parametry to ints, więc nie widzę, jak to może być problemem. – Justin

Odpowiedz

2

Koniecznie przeczytaj: http://www.sommarskog.se/query-plan-mysteries.html

same zasady stosuje się do proca i sp_executesql. Ogromny powód, dla którego tandetne plany mogą być przekazywane w parametrze nvarchar dla pola varchar, powoduje skanowanie indeksu w przeciwieństwie do poszukiwań.

Bardzo wątpię, czy dane wyjściowe wpływają na wydajność, może to być problem z jednym z przesłanych parametrów lub selektywnością tabel.

Podczas testowania danych wyjściowych z profilera należy pamiętać, aby dołączyć sp_executesql i upewnić się, że ustawienia są zgodne (takie jak SET ARITHABORT), w przeciwnym razie spowoduje to wygenerowanie nowego planu.

Zawsze można wykopać tandetne planu z pamięci podręcznej wykonanie poprzez sys.dm_exec_query_stats

+0

czy to samo odnosi się do INT vs BIGINT? – Phill

+0

@Phill nie wydaje się, że SQL z przyjemnością używa poprawnego indeksu w tym przypadku. –

+0

Dobrze, mamy starszą bazę danych, w której pierwotny programista myślał duży. (baza danych ma 10 lat) wszystkie nowe tabele są typu INT, ale z kluczem obcym do BIGINT. Przez chwilę martwiłem się, że może to spowodować problemy z wydajnością! – Phill