Wydajność CLR integracja
This topic discusses some of the design choices that enhance the performance of Microsoft SQL Server integration with the Microsoft .NET Framework common language runtime (CLR).
Proces kompilacji
Podczas tworzenia wyrażenia SQL, w przypadku odwołania do procedury zarządzanych Microsoft jest generowany w wejściowym język pośredni (MSIL). Skrótowa to zawiera kod, aby zorganizować rutynowych parametrów z SQL Server Aby do środowiska CLR wywołania funkcja i zwraca wynik. Ten kod "przyklej" jest oparty na typ parametru i kierunek parametru (w programie, out lub odwołania).
Kod przyklejania umożliwia optymalizację specyficzne dla typu i zapewnia efektywne wykonywanie SQL Server Semantyka, takie jak opcje dopuszczania wartości null, ograniczający aspekty, przez wartość i obsługa standardowych wyjątków. Przez generowania kodu dla dokładne typy argumentów, należy unikać typu przymus lub otoka obiektu tworzenia kosztów (nazywanego "bokserskie") na granicy wywołania.
Wejściowe generowane jest kompilowany do kodu macierzystego i zoptymalizowane pod kątem architektury danego sprzętu, na którym SQL Server wykonuje, za pomocą usługi JIT (just-in-czas) kompilacji środowiska CLR. Usługi JIT wywoływane poziom metoda i umożliwić SQL Server Obsługa środowiska tworzenia kompilacji pojedynczej jednostki, rozmieszczonych w obu SQL Server i wykonanie środowiska CLR. Po jest skompilowana procedura wejścia, staje się wynikowy wskaźnik funkcja wykonywania-czas implementacji funkcja.Ta metoda generowania kodu zapewni nie koszty dodatkowe wywołania związane z odbicie lub metadane dostępu przy uruchomieniu czas.
Szybkie przejścia między programu SQL Server i CLR
Proces kompilacji daje wskaźnik funkcja, które mogą być wywoływane w czasie wykonywania kodu macierzystego.przypadek wystąpienia wartości wartość skalarna funkcja zdefiniowanej przez użytkownika to wywołanie funkcja odbywa się na podstawie na wiersz.Aby zminimalizować koszty przechodzi między SQL Server a do środowiska CLR instrukcji, które zawierają wszystkie zarządzane wywołania kroku uruchomienia do identyfikowania domena aplikacji miejsce docelowe. W tym kroku identyfikacji zmniejsza koszt przechodzi dla każdego wiersza.
Zagadnienia wydajności
Poniżej zestawiono szczególne zagadnienia wydajności do środowiska CLR integracja SQL Server. Bardziej szczegółowe informacje można znaleźć w"Przy użyciu środowiska CLR integracja programu SQL Server 2005"w witrynie MSDN witryna sieci Web.Ogólne informacje dotyczące kod zarządzany wydajności można znaleźć w"Zwiększanie wydajności aplikacji .NET i skalowalność"w witrynie MSDN w sieci Web.
Funkcje zdefiniowane przez użytkownika
Funkcje środowiska CLR korzystać ze ścieżka wywołania szybciej niż w przypadku Transact-SQL Funkcje zdefiniowane przez użytkownika. Ponadto znajduje się kod zarządzany korzyści decydujące wydajności przez Transact-SQL z punktu widzenia kodu procedur, obliczenia i manipulowanie ciągami. CLR functions that are computing-intensive and that do not perform data access are better written in managed code.Transact-SQL functions do, however, perform data access more efficiently than CLR integration.
Agregaty zdefiniowany przez użytkownika
Kod zarządzany może znacznie przewyższyć oparte na kursor agregacja.Kod zarządzany zazwyczaj wykonuje nieco wolniej niż wbudowane SQL Server Funkcje agregujące. Zaleca się, że jeśli macierzysta wbudowaną funkcja agregacja, należy używać go.W przypadkach, w których potrzebnych agregacja jest nie obsługiwane należy wziąć pod uwagę agregatu CLR zdefiniowanej przez użytkownika na wykonanie na kursor w ze względu na wydajność.
Funkcje przesyłania strumieniowego Valued tabela
Aplikacje często trzeba zwrócić tabela z wywoływanie funkcja.Przykładami odczytywania danych z pliku w ramach operacji importowania i konwertowanie przecinka--wartości oddzielone do reprezentacji relacyjnej.Zazwyczaj można to osiągnąć materializing i wypełnianie tabela wyników przed zużycia przez obiekt wywołujący.Integracja CLR do SQL Server wprowadzenie do nowego mechanizmu rozszerzania o nazwie funkcja strumieniowych wycenione tabela (STVF). Zarządzane STVFs wykonywać lepiej niż implementacje porównywalnych rozszerzona procedura składowana.
STVFs are managed functions that return an IEnumerable interface.IEnumerable has methods to navigate the result set returned by the STVF.Gdy STVF zostanie wywołany, zwrócona IEnumerable jest bezpośrednio podłączony do planu kwerend. Wywołania planu kwerendy IEnumerable metody w razie potrzeby pobierania wierszy. Ten model iteracji pozwala wyniki ma zostać zużyta natychmiast po produkowane w pierwszym wierszu, zamiast dopiero cała tabela jest pusta.On również znacznie zmniejsza ilość pamięci zużywanej przez wywoływania funkcja.
W stosunku do macierzySPACJA lub tabulator
Kiedy Transact-SQL kursory musi przechodzić przez dane, które są łatwiejsze wyrażona jako tablica, kod zarządzany, może być używany z wzrost wydajności znaczący.
Ciąg danych
SQL Server znak danych, takich jak varchar, może być typu SqlString lub SqlChars zarządzanej funkcji. Zmienne SqlString tworzone jest wystąpienie całej wartości do pamięci.Zmienne SqlChars zapewniają strumieniowych interfejs, który można osiągnąć większą wydajność i skalowalność, nie tworząc wystąpienie całej wartości do pamięci.Staje się to szczególnie ważne w przypadku dużych obiektów (LOB) danych.Ponadto serwer dane XML mogą być udostępniane za pośrednictwem interfejs strumienia, zwracane przez SqlXml.CreateReader().
W stosunku do środowiska CLR.Rozszerzonych procedur przechowywanych
Microsoft.SqlServer.Server, interfejsy programowania aplikacji (API umożliwiające zarządzanych procedur w celu wysyłania wyników) ustawia się powrotem do klient działać lepiej niż Open Data Services (ODS) API używany przez rozszerzonych procedur przechowywanych.Ponadto interfejsy API System.Data.SqlServer obsługiwane typy danych takich jak xml, varchar(max), nvarchar(max), a varbinary(max), wprowadzone w SQL Server 2005, a ODS API nie zostały rozszerzone do obsługi nowych typów danych.
Z kod zarządzany SQL Server zarządza wykorzystanie zasobów, takich jak pamięć, wątków i synchronizacji. Wynika to zarządzanych interfejsów API, które narażają te zasoby są wykonywane na górze SQL Server Menedżer zasób. I odwrotnie, SQL Server nie ma widoku lub kontrolować wykorzystanie zasób przez rozszerzona procedura składowana. Na przykład jeśli rozszerzone procedura przechowywana zajmuje za dużo zasobów PROCESORA lub pamięci, ma możliwości wykrywać lub sterować tym z SQL Server. Z kodem zarządzanym, jednak SQL Server mogą wykryć, czy dany wątek nie został uzyskany przez długi czas, a następnie zmusić wydajności, dzięki czemu inne zadania mogą być planowane zadania. W związku z tym przy użyciu kod zarządzany zapewnia lepszą skalowalność i system wykorzystanie zasób.
Kod zarządzany mogą powodować dodatkowe obciążenie środowiska wykonywania i sprawdzania zabezpieczeń.Na przykład, jest przypadek, gdy uruchomiony SQL Server i wiele przejścia z kodu zarządzanego do trybu macierzystego (ponieważ SQL Server musi wykonać dodatkową obsługę ustawienia specyficzne dla wątek, przemieszczając do kodu macierzystego i z powrotem). W związku z tym rozszerzone procedury przechowywane mogą znacznie przewyższyć uruchomiony kod zarządzany SQL Server w przypadkach, w których występują częste przejść między kodu zarządzanego i macierzystym.
Uwaga
Zaleca się, że nie opracowywania nowych rozszerzonych procedur przechowywanych, ponieważ funkcja ta została zaniechana.
Macierzysta serializacji dla Typy definiowane przez użytkownika
User-defined types (UDTs) are designed as an extensibility mechanism for the scalar type system.SQL Server implements a serialization format for UDTs called Format.Native.Podczas kompilacji struktura tego typu jest badany do generowania MSIL, który jest dostosowany do tej definicji określonego typu.
Szeregowanie macierzystym jest implementacją domyślnej dla SQL Server. User-defined serialization invokes a method defined by the type author to do the serialization.Format.Native serialization should be used when possible for best performance.
Normalizacja porównywalnych UDTs
Relacyjne operacje, takie jak sortowania i porównywania UDTs, pracować bezpośrednio na reprezentacja binarna wartość.Można to osiągnąć przez przechowywanie pliku znormalizowana (binarnym Zamówione) reprezentacja stanu UDT na dysku.
Normalizacja ma dwie zalety: ułatwia operacja porównania znacznie tańsze przez uniknięcie budowy wystąpienie typu oraz kwotę narzutu wywołania metoda; i tworzy domena binarne dla UDT, umożliwiając budowy histogramy, indeksów i histogramów dla wartości typu. W związku z tym UDTs znormalizowana ma profilu wydajności bardzo podobny do trybu macierzystego wbudowanych typów dla operacji, które nie obejmują wywołania metoda.
Skalowalna użycie pamięci
W celu wyrzucania elementów zarządzanych kolekcja do wykonywania oraz również w skali SQL Server, Unikaj dużych, jednej alokacji. Większa niż 88 kilobajtów (KB) rozmiar zostanie umieszczony na duże sterty obiektu, co może spowodować, że usuwanie elementów bezużytecznych wymagane do wykonywania i skalować wiele przydziałów jeszcze pogorszyć sprawę niż wiele mniejszych przydziałów.Na przykład jeśli trzeba przydzielić dużą tablic wielowymiarowych, lepiej jest przydzielić postrzępione tablicy (rozproszonego).