Wydajność CLR integracji
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 kompilacji wyrażeń SQL, w przypadku odniesienia do procedury zarządzanych Microsoft skrótowych język pośredni (Intermediate) jest generowany.Skrótowa to zawiera kod, aby zorganizować rutynowych parametry z SQL Server do środowiska CLR, wywołuje funkcja i zwraca wynik.To "glue" Kod jest oparty na typ parametru i kierunek parametru (w out lub odwołania).
Kod przyklejania umożliwia optymalizacje specyficzne dla typu i zapewnia skuteczne stosowanie SQL Server semantyka, takich jak opcje dopuszczania wartości null, ograniczenia, przez wartość i obsługa standardowych wyjątek.Służy do generowania kodu dla dokładnego typy argumentów, można uniknąć typu przymus lub otoki obiektów tworzenia koszty (nazywanych "bokserskie") na granicy wywołania.
Skrótowa generowane jest kompilowany do kodu macierzystego i zoptymalizowany pod kątem architektury konkretnego sprzętu, na którym SQL Server wykonuje, za pomocą usług JIT (just-in-czas) kompilacji środowiska CLR.Usługi JIT są wywoływane poziom metoda i umożliwić SQL Server środowisko tworzenia kompilacji pojedynczej jednostki rozciągające się zarówno hostingu SQL Server i wykonanie CLR.Po skompilowaną skrótowej staje się wynikowy wskaźnik funkcja Uruchom -czas implementacji funkcja.Ta metoda generowania kodu zapewnia nie koszty dodatkowe wywołania związane z odbicie lub metadane dostępu przy uruchomieniu czas.
Fast przejścia między SQL Server i CLR
Proces kompilacji daje wskaźnik funkcja, które mogą być wywoływane przy uruchomieniu czas z kodem macierzystym.W przypadek wartości wartość skalarna funkcja zdefiniowanej przez użytkownika tego wywołania funkcja dzieje się na podstawie na wiersz.Aby zminimalizować koszty przechodzi między SQL Server i środowisko CLR sprawozdania zawierające wszystkie zarządzane wywołania kroku uruchamiania do identyfikowania domena aplikacji miejsce docelowe.W tym kroku identyfikacji zmniejsza koszt przechodzi dla każdego wiersza.
Zagadnienia wydajności
Poniżej podsumowano szczególne zagadnienia wydajności do integracja CLR SQL Server.Bardziej szczegółowe informacje można znaleźć w "Za pomocą CLR integracji programu SQL Server 2005" w witrynie MSDN witryna sieci Web.Informacje ogólne dotyczące kod zarządzany wydajności można znaleźć w "Zwiększanie.NET aplikacji wydajność i skalowalność" w witrynie MSDN witryna sieci Web.
Funkcje zdefiniowane przez użytkownika
Funkcje CLR korzyści ze ścieżka wywołania szybciej niż Transact-SQL Funkcje zdefiniowane przez użytkownika.Ponadto kod zarządzany ma zaletę decydującego wydajności nad Transact-SQL Kod proceduralne, obliczeń, i manipulacji ciąg.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 zdefiniowane przez użytkownika
Kod zarządzany znacznie może przewyższyć kursor na podstawie agregacja.Kod zarządzany zazwyczaj wykonuje nieco wolniej niż wbudowane SQL Server wartość zagregowana funkcji.Zaleca się że jeśli macierzystym wbudowaną funkcja agregująca istnieje, należy go używać.W przypadkach gdy wymagane agregacja jest nie obsługiwane, należy rozważyć agregatu CLR użytkownika nad implementacji oparta kursor ze względu na wydajność.
Funkcje przesyłania strumieniowego oródwierszową
Aplikacje często trzeba zwrócić tabela z wywoływanie funkcja.Przykładami odczytu z pliku danych tabelarycznych, jako część operacji importowania i konwertowanie-CSV do reprezentacji relacyjnej.Zazwyczaj można to osiągnąć przez materializing i wypełnianie tabela wyników, zanim mogą być spożywane przez obiekt wywołujący.Integracja CLR do SQL Server wprowadzono nowy mechanizm rozszerzeń nazywanych streaming funkcja zwracająca tabelę (STVF).STVFs zarządzanych lepiej niż porównywalne rozszerzona procedura składowana implementacji.
STVFs are managed functions that return an IEnumerable interface.IEnumerable has methods to navigate the result set returned by the STVF.Po wywołaniu STVF zwracane IEnumerable jest bezpośrednio podłączony do planu kwerend.Wywołania planu kwerendy IEnumerable metod, w razie potrzeby pobierania wierszy.Ten model iteracji pozwala wyniki zużywanego natychmiast po pierwszy wiersz jest produkowane, zamiast czekać, aż cała tabela jest wypełniana.On również znacznie zmniejsza pamięci zużywanej przez wywoływanie funkcja.
Tablice vs.Kursory
Gdy Transact-SQL kursory musi przechodzić przez danych, łatwiej jest wyrażona jako tablica, kod zarządzany, może być używany z wydajności znaczące zyski.
Ciąg danych
SQL Serverznak danych, takich jak varchar, może być typu SqlString lub SqlChars w funkcji zarządzanych.Zmienne SqlString utworzyć wystąpienie całą wartość do pamięci.Zmienne SqlChars dostarcza interfejs strumieniowych, 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 dla dużego obiektu (LOB) danych.Ponadto serwer dane XML można uzyskać dostęp za pośrednictwem interfejs strumieniowych, zwrócony przez SqlXml.CreateReader().
CLR vs.Rozszerzone procedury przechowywane
Microsoft.SqlServer.Server interfejsów programowania aplikacji (API umożliwiające zarządzanych procedur do wysłania wyniku) ustawia powrót klient lepiej niż Otwórz danych usług OZON API używany przez rozszerzonych procedur przechowywanych.Ponadto typy danych obsługa API System.Data.SqlServer takich jak xml, varchar(max), nvarchar(max), i varbinary(max), wprowadzone w SQL Server 2005, podczas gdy nie zostały rozszerzone ODS API do obsługi nowych typów danych.
Z kod zarządzany SQL Server zarządza wykorzystanie zasobów, takich jak pamięć, wątki i synchronizacji.Wynika to API zarządzanego, ujawniające zasoby te są wykonywane na górze SQL Server Menedżera zasób.Odwrotnie SQL Server nie ma widok lub kontrolować wykorzystanie zasób przez rozszerzona procedura składowana.Na przykład, jeśli rozszerzona procedura składowana zajmuje zbyt dużo zasobów Procesora lub pamięci, istnieje sposób nie wykrywać lub z tego SQL Server.Z kod zarządzany, jednak SQL Server może wykryć, że dany wątek nie pomierzone przez długi okres czas, a następnie zmusić zadania, plon, dzięki czemu można zaplanować pracy innych.W konsekwencji przy użyciu kod zarządzany zapewnia lepszą skalowalność i system obciążenie zasób.
Kod zarządzany może ponieść dodatkowe obciążenie, niezbędne do utrzymania środowiska wykonania i sprawdzania zabezpieczeń.Jest to przypadek, na przykład podczas uruchomienia wewnątrz SQL Server i wymagane są liczne przejścia z kodu zarządzanego do macierzystego (ponieważ SQL Server musi wykonać obsługę dodatkowych ustawień specyficznych dla wątek, przemieszczając do kodu macierzystego i kopii).W związku z tym rozszerzone procedury przechowywane mogą znacznie przewyższyć uruchomiony kod zarządzany SQL Server dla przypadków, w których występują częste przejścia między kodu zarządzanego i macierzystym.
Ostrzeżenie
Zaleca się, aby nie opracowanie nowych rozszerzonych procedur przechowywanych, ponieważ funkcja ta została zaniechana.
Macierzysty serializacji typów zdefiniowanych 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 typu jest badana wygenerować instrukcje MSIL, który jest dostosowany do tej definicji określonego typu.
Serializacji macierzystym jest domyślna implementacja 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, działają bezpośrednio na reprezentacja binarna wartość.Można to osiągnąć dzięki przechowywaniu znormalizowanej (binarny zamówione) reprezentacja stanu UDT na dysku.
Normalizacja ma dwie zalety: ułatwia porównanie w operacji znacznie tańsze przez uniknięcie budowy wystąpienie typu i narzutów wywołania metoda; i tworzy domena binarne dla UDT, umożliwiając budowy histogramy, indeksów i histogramy dla wartości typu.W rezultacie znormalizowanej UDTs mają profilu wydajności bardzo podobne do macierzystego wbudowanych typów operacji, które nie obejmują wywołania metoda.
Skalowalna użycie pamięci
W celu dla zarządzanych wyrzucanie elementów bezużytecznych do wykonywania i dobrze w skali SQL Server, należy unikać dużych, jednej alokacji.Większa niż 88 kilobajtów (KB) rozmiar alokacji zostanie umieszczony na sterty obiektu dużych spowoduje wyrzucanie elementów bezużytecznych do wykonywania i skalować znacznie gorsze niż wiele mniejszych alokacje.Na przykład jeśli trzeba przydzielić dużą tablicą wielowymiarową, lepiej jest przydzielić nieregularnej tablicy (rozproszone).