Artykuły

A A A
Drukuj Ekportuj do PDF
Opublikowane: 2002.06.22 1:16 | Jacek Kolonko | Aktualizacja: 2006.01.06 0:06

SQL Server Profiler i aplikacje Web

Analiza wydajności jest kluczem do stworzenia optymalnego rozwiązania. Jednak wykonywanie ręcznych pomiarów jest dosyć skomplikowane. Microsoft SQL Server zawiera odpowiednie narzędzia, które w dużym stopniu ułatwiają wykonywanie skomplikowanych analiz. Co więcej – specjalny kreator potrafi automatycznie zaproponować utworzenie indeksów, które przyspieszą wykonywanie konkretnych operacji bazodanowych. W niniejszym artykule przedstawiony jest sposób praktycznego wykorzystania SQL Server Pr

Wielu programistów pomija program SQL Server Profiler zawarty w SQL Server 2000 i 7.0 jako narzędzie developerskie. Ponieważ jedną z funkcji Profilera jest monitorowanie i raportowanie o różnych poziomach wydajności bazy danych, SQL Server można wykorzystać, by zobaczyć, jak aplikacja WWW współpracuje z serwerem. Profiler może też pomóc analizować efektywność kodu. Można na przykład użyć Profilera, by określić, kiedy aplikacja Web byłaby wydajniejsza, przy równoczesnym używaniu Query Analyzera do wykonywania zapytań i optymalizacji kodów.

Aby utworzyć dane bazowe dla Profilera do analizy komunikacji pomiędzy aplikacją Web a SQL Serwerem, warto na początku przetestować kilka stronic. Należy wybrać narzędzie testujące, które rzeczywiście spowoduje obciążenie aplikacji, a następnie uruchomić Profilera, by przyjrzeć się temu obciążeniu. Warto też sprawdzić ostatnią wersję narzędzia testującego Web Application Stress Tool, na przykład ze strony Microsoft Download Center. Application Center, nowy produkt Microsoftu, także zawiera nową wersję tego narzędzia.

Po uruchomieniu śledzenia za pomocą Profilera warto zapisać wyniki pod łatwo rozpoznawalnymi nazwami, a po przeprowadzeniu kilku testów ponownie porównać wyniki dla każdego z kroków. Można także zapisać wyniki śledzenia i powtórzyć obciążenie później, by móc symulować rzeczywiste obciążenie na bazie danych. Trzeba też pamiętać, że obciążenie powtarzane za pomocą Profilera lub Query Analyzera jest tylko symulacją i może różnić się od obciążenia, jakie wygenerowałaby działająca aplikacja WWW. Poniżej przedstawiam proste testy, które przeprowadziłem, by zilustrować użycie Profilera.

Test 1: Uruchamianie prostego zapytania w skrypcie ASP

Wydruk 1: Database.asp

<%
Function RunWithRS(strSP , strDSN) 
'Response.Write "<br> sql is : " & strsp & "<br>" & "  DSN is " & strDSN & "<br>"
    If strDSN = "" Then
        If modDSN = "" Then
            RunWithRS = -99
        Else
            strDSN = modDSN
        End If
    End If
    Dim rs , cmd 
    Set rs = CreateObject("ADODB.Recordset")
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = strDSN
    cmd.CommandText = strSP
    cmd.CommandType = adCmdText
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenForwardOnly
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing
    Set RunWithRS = rs
    Set rs = Nothing
End Function
%>

Przede wszystkim został napisany skrypt ASP (patrz powyższy wydruk Database.asp), zawierający funkcje RunWithRS. Następnie powstał krótki skrypt, FirstData.asp, który wywołuje funkcję RunWithRS i uruchamia zapytanie SQL:

sSQL = "select ckey1,col2 from testtable  where ckey1 = 'a' "

Skrypt FirstData.asp został zainstalowany na dwóch serwerach Web. Serwer 1 był stacją roboczą Windows 2000 z procesorem Pentium 600MHz i 192MB pamięci RAM. Serwer 2 był to Toshiba Tecra (133 MHz Pentium, 144MB pamięci RAM) z Windows 2000 oraz uruchomionym SQL Serverem 7.0.

Uruchomiłem Profiler i po ustawieniu właściwości rozpocząłem śledzenie. A oto wyniki (które wynik zamieszczono na poniższym rysunku): linijka SQL:BatchStarting określa początek wsadowego zapytania SQL, który został uruchomiony z serwera 1, linia SQL:BatchCompleting pokazuje koniec tej operacji.

SQL Server Profiler

W pierwszym teście czas trwania był identyczny. Wyniki były takie, jakich można było się spodziewać, ponieważ dostęp do bazy danych z obu systemów powinien pokazać te same czasy dostępu. Jedyną różnicą w teście był serwer Web, który nie wpływał na czas wykonania zapytania.

Test 2: Uruchamianie procedury przechowywanej FirstData2.asp

W drugim teście stworzyłem procedurę przechowywaną za pomocą następujących instrukcji SQL:

CREATE PROCEDURE GetTestDataByKey
@ckey char(1)
AS
SELECT ckey1,col2 FROM testtable WHERE ckey1 = @ckey

Następnie uruchomiłem tą procedurę; wystarczyła zmiana parametru sSQL na:

sSQL = "exec GetTestDataByKey 'a'"

Test 2 trwał 1443 ms, co prawie równa się 1494 ms osiągniętych dla dynamicznego zapytania SELECT z testu 1.

Test 3: Używanie obiektu ADO Command w skrypcie FirstData2.asp

Dla testu 3 użyłem obiektu ADO Command i stworzyłem kolekcję parametrów dla przechowywanej procedury. Wydruk 2 (poniżej) pokazuje funkcję zawierającą kod ADO. Podjąłem obserwację i zapisałem wyniki do pliku trace1.trc. Po uruchomieniu FirstData2.asp, skrypt .asp − zawierający kody ADO z kolekcją parametrów − podał czasy trwania od 1370 ms do 1600 ms. Następnie śledzenie zostało przerwane.

Wydruk 2: Kod ADO dla FirstData2.asp

Function RunSPGetRecord(strSP, sckey)           
        Dim rs, cmd, OutPutParms
        Set rs = Server.CreateObject("adodb.Recordset")
        Set cmd = Server.CreateObject("adodb.Command")
        ' Inicjalizacja obiektów ADO i procedur przechowywanych
        cmd.ActiveConnection = getDSN()
        cmd.CommandText = strSP
        cmd.CommandType = adCmdStoredProc
            cmd.Parameters.Append cmd.CreateParameter("@ckey",adchar,adParamInput, 1,sckey )
        rs.CursorLocation = adUseClient
        rs.Open cmd, , adOpenStatic, adLockReadOnly
        if OutPutParms then OutArray = collectOutputParms(cmd, params)
        Set cmd.ActiveConnection = Nothing
        Set cmd = Nothing
        Set rs.ActiveConnection = Nothing
        Set RunSPGetRecord = rs
End Function

Test 4: Używanie Index Tuning Wizard

W ostatnim teście uruchomiłem narzędzie Profilera − Index Tuning Wizard z menu Tools. By użyć Index Tuning Wizard, w pierwszym oknie należy kliknąć Next. W następnym wybieramy bazę danych, którą będziemy testowali, po czym klikamy przycisk Next. W trzecim oknie pozostawiamy zaznaczone I have a saved workload file i klikamy Next. (Wynik śledzenia można zapisać jako plik SQL lub obciążenia). W następnym oknie należy wybrać plik obciążenia przez kliknięcie przycisku My workload file button, wskazać swój plik i następnie kliknąć Next. W kolejnym oknie wybieramy tylko tę tablicę, którą będziemy testować, i klikamy Next.

Index Tuning Wizard uruchomi obciążenie, które zostało przechwycone z moich obserwacji dotyczących bazy danych i analizowanego obciążenia. Kiedy Wizard zakończył analizy i zasugerował utworzenie indeksu. Jedna z analiz pokazała szacunkowy, 80-procentowy wzrost wydajności! Na ekranie wydajności danych kliknąłem Next. W następnym ekranie kliknąłem Apply changes, a potem Next. W ostatnim ekranie kliknąłem Finish, by zastosować proponowany indeks.

Gdy ponownie uruchomiłem testy z nowym indeksem, Index Tuning Wizard poprawił wydajność przetwarzania dla każdej strony. Jednakże wzrost był około 25-procentowy. Rezultaty były takie same zarówno dla przechowywanej procedury, jak i dla dynamicznego zapytania SQL z testu 1. Kolumna CPU (procesora) była bardziej interesująca. Liczby CPU zarejestrowane przed zastosowaniem indeksu zmieniały się w zakresie od 410 ms do 441 ms po zmianie indeksu, liczby CPU zmalały do 270 ms dla dynamicznego SQL-a i dla przechowywanej procedury zakres od 210 ms do 240 ms. Jak widać, dodanie jednego indeksu w tabeli zdecydowanie zwiększyło wydajność i zmniejszyło obciążenie procesora na serwerze.

Potężne narzędzie do śledzenia

Poruszyłem w tym artykule raczej wąski obszar analizy. Programista może rozpocząć generowanie początkowych analiz wydajnościowych poprzez testowanie paru stron (nawet sztucznie stworzonych), tak jak ja to zrobiłem. Następnie będzie mógł użyć Profilera, by bardziej zagłębiać się w swoje aplikacje Web-owe i przyglądać ich aktywności dokładniej. Na przykład może przechwycić inne, różne rodzaje ważnych statystyk dla każdego kroku, który SQL Serwer przechodzi podczas wykonywania twojego zapytania SQL lub przechowywanej procedury. Trzeba też zapamiętać, że stosowanie polecanych indeksów we własnej bazie danych może znacznie poprawić wydajność. Więcej informacji o Profilerze można znaleźć w artykule Itzik Ben-Gan, Trace That Event with SQL Server Profiler, April 2000; Paul Burke, Using SQL Profiler, July 1999; Brian Moran, What? You Still Aren't Using SQL Profiler? dostępnym online na stronie SQL Magazine, numer InstantDoc 16122.

Spis treści SQL Server Profiler i aplikacje Web jest tłumaczeniem artykułu Kena Spencera

Komentarze 0 Masz uwagi do tej strony? Napisz

Dodaj komentarz

avatar

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Autor Jacek Kolonko
avatar VIP
 

What do you want to write today? ;)

Załóż konto
WSS to serwis, który łączy dziesiątki tysięcy specjalistów IT w Polsce, zajmujących się szeroko pojętymi technologiami Microsoft. Portal działa od 2003 roku, i oprócz setek publikacji technicznych, rozwijającego się forum - portal to ludzie, którzy go tworzą. To właśnie z myślą o nich warto codziennie nas odwiedzać.

Dowiedz się więcej o WSS

vGuru - Zostań Guru Wirtualizacji

 

MetroOne

Idź na górę strony