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!
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. –
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