SQL Server w logistyce

Tabela _sessionlog w bazie danych SQL Server

Rejestr sesji pulpitu zdalnego — czas połączenia, bezczynności i rozłączenia wraz z danymi stanowiska klienckiego.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • Wiersz opisuje stan sesji pulpitu zdalnego: kiedy się zaczęła, jak długo trwała bezczynność i kiedy została zamknięta.
  • Zapis obejmuje dane stanowiska klienckiego — nazwę komputera, rozdzielczość i dwa adresy IP: lokalny oraz publiczny.
  • Kolumna IDLETIME pozwala odróżnić sesję aktywną od porzuconej, która wciąż zajmuje zasoby serwera.
  • Tabela ma dziewięć indeksów, w tym dwa obejmujące niemal wszystkie kolumny — to przypadek wart osobnego omówienia.

Do czego służy tabela [dbo].[_sessionlog]

Gdy aplikacja jest udostępniana przez pulpit zdalny, obciążenie serwera zależy nie od liczby zatrudnionych, lecz od liczby sesji utrzymywanych jednocześnie. Tabela [dbo].[_sessionlog] gromadzi dane pozwalające to zmierzyć: momenty połączenia, rozłączenia i ostatniej aktywności, a także stan każdej sesji.

Zakres zapisywanych informacji sięga poza serwer. Nazwa komputera klienckiego, jego rozdzielczość, numer kompilacji klienta oraz dwa adresy IP — lokalny i publiczny — pozwalają ustalić, skąd faktycznie łączy się użytkownik. Rozróżnienie obu adresów ma praktyczne znaczenie: pokazuje, czy połączenie idzie z sieci firmowej, czy z zewnątrz.

Najbardziej użyteczną kolumną w codziennej pracy jest IDLETIME, czyli czas bezczynności w minutach. To on odróżnia sesję, w której ktoś pracuje, od pozostawionej na noc — a ta druga zajmuje pamięć serwera i, jeżeli licencja liczona jest stanowiskami, blokuje dostęp komuś innemu.

Co rejestr mówi o pojedynczej sesji
Połączenie PołączenieCzas logowania, konto domenowe i nazwa serwera
Stanowisko StanowiskoNazwa komputera, rozdzielczość oraz adres lokalny i publiczny
Aktywność AktywnośćCzas ostatniej czynności i liczba minut bezczynności
Zakończenie ZakończenieMoment rozłączenia i przyczyna zmiany stanu sesji

Sesja rozłączona nie jest tym samym co zamknięta — pozostaje na serwerze i zwalnia zasoby dopiero po wygaśnięciu limitu czasu.

Budowa tabeli — wykaz kolumn

Dwadzieścia dwie kolumny opisują sesję w trzech wymiarach: kto i skąd się łączy, kiedy oraz w jakim jest stanie.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Użytkownik i serwer
ID_LOGint
liczba całkowita
takUnikalny identyfikator logu sesji
SESSIONIDint
liczba całkowita
takUnikalny identyfikator sesji
USERNAMEvarchar(50)
tekst do 50 znaków
nieNazwa użytkownika sesji
USERACCOUNTvarchar(100)
tekst do 100 znaków
nieKonto użytkownika w domenie lub na serwerze
DOMAINNAMEvarchar(50)
tekst do 50 znaków
nieNazwa domeny użytkownika
SERVERvarchar(15)
tekst do 15 znaków
nieNazwa serwera, na którym odbywała się sesja
WINDOWSSTATIONNAMEvarchar(100)
tekst do 100 znaków
nieNazwa stacji roboczej Windows używanej przez użytkownika
Stanowisko klienckie
CLIENTNAMEvarchar(15)
tekst do 15 znaków
nieNazwa komputera klienckiego
CLIENTIPADRESSvarchar(50)
tekst do 50 znaków
nieAdres IP klienta sesji RDP
CLIENTREMOTEIPADRESSvarchar(50)
tekst do 50 znaków
niePubliczny adres IP klienta sesji RDP
CLIENTDISPLAYvarchar(250)
tekst do 250 znaków
nieRozdzielczość ekranu klienta sesji RDP
CLIENTBUILDNUMBERint
liczba całkowita
nieNumer kompilacji klienta RDP
Czasy i stan sesji
LOGINTIMEdatetime
data i godzina
nieData i czas logowania użytkownika do sesji
CONNECTTIMEdatetime
data i godzina
nieData i czas nawiązania połączenia sesji
DISCONNECTTIMEdatetime
data i godzina
nieData i czas rozłączenia sesji
LASTINPUTTIMEdatetime
data i godzina
nieData i czas ostatniej aktywności użytkownika
CURRENTTIMEdatetime
data i godzina
nieAktualny czas rekordu sesji
IDLETIMEfloat
liczba zmiennoprzecinkowa
nieCzas bezczynności sesji, mierzony w minutach
CONNECTIONSTATEvarchar(20)
tekst do 20 znaków
nieStan połączenia sesji (np. Aktywna, Rozłączona)
SESSIONCHANGERESONvarchar(50)
tekst do 50 znaków
takPrzyczyna zmiany stanu sesji
KIEDYdatetime
data i godzina
takData i czas, kiedy rekord został dodany do bazy danych
TIMESTAMPtimestamp
znacznik wersji wiersza
takZnacznik czasu aktualizacji rekordu

Kolumna IDLETIME ma typ float i podaje czas bezczynności w minutach. Warto porównywać ją z LASTINPUTTIME — rozbieżność między nimi wskazuje, że rekord sesji nie był ostatnio odświeżany.

Indeksy i wydajność zapytań

Zestaw indeksów tej tabeli jest nietypowy i zasługuje na komentarz, bo pokazuje problem spotykany w wielu bazach produkcyjnych.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
CONNECTTIME_SERVER_USERNAMECONNECTTIME, SERVER, USERNAME, KIEDYzwykły
DISCONECTTIME_USERNAME_KIEDYID_LOG, CLIENTBUILDNUMBER, CLIENTDISPLAY, CLIENTIPADRESS, CLIENTNAME, CONNECTIONSTATE, CONNECTTIME, CURRENTTIME, DOMAINNAME, IDLETIME, LASTINPUTTIME, LOGINTIME, SERVER, USERACCOUNT, WINDOWSSTATIONNAME, SESSIONID, SESSIONCHANGERESON, TIMESTAMP, CLIENTREMOTEIPADRESS, DISCONNECTTIME, USERNAME, KIEDYzwykły
KIEDYCONNECTTIME, IDLETIME, SERVER, USERNAME, KIEDYzwykły
PK__sessionlogID_LOGklucz główny
SESSIONCHANGERESONSESSIONCHANGERESONzwykły
USERNAMECONNECTTIME, CURRENTTIME, IDLETIME, LASTINPUTTIME, SERVER, SESSIONID, USERNAMEzwykły
USERNAME_CONNECTTIME_CURRENTTIME_IDLETIME_LASTINPUTTIME_SERVER_SESSIONIDCONNECTTIME, CURRENTTIME, IDLETIME, LASTINPUTTIME, SERVER, SESSIONID, USERNAMEzwykły
USERNAME_DISCONECTTIME_LOGINTIMEDISCONNECTTIME, LOGINTIME, USERNAMEzwykły
USERNAME_KIEDY_DISCONECTTIMEID_LOG, CLIENTBUILDNUMBER, CLIENTDISPLAY, CLIENTIPADRESS, CLIENTNAME, CONNECTIONSTATE, CONNECTTIME, CURRENTTIME, DOMAINNAME, IDLETIME, LASTINPUTTIME, LOGINTIME, SERVER, USERACCOUNT, WINDOWSSTATIONNAME, SESSIONID, SESSIONCHANGERESON, TIMESTAMP, CLIENTREMOTEIPADRESS, USERNAME, KIEDY, DISCONNECTTIMEzwykły

Dwa z dziewięciu indeksów obejmują niemal wszystkie kolumny tabeli. Taki indeks jest w praktyce drugą kopią danych: podwaja miejsce zajmowane przez tabelę, wydłuża każdy zapis i musi być aktualizowany przy każdej zmianie stanu sesji. Kilka pozostałych pokrywa się zakresem — na przykład USERNAME i USERNAME_CONNECTTIME_CURRENTTIME_IDLETIME_LASTINPUTTIME_SERVER_SESSIONID obejmują dokładnie ten sam zestaw kolumn.

Nadmiar indeksów — jak powstaje i co kosztuje

Indeksy tej tabeli są dobrym przykładem procesu, który przebiega niemal identycznie w każdej bazie rozwijanej przez kilka lat.

Cena dodatkowego indeksu
ObszarWpływ indeksuKiedy się opłaca
Odczyt zapytania wzorcowegoSkrócenie czasu, czasem wielokrotneZapytanie wykonywane często
Zapis wierszaKażdy indeks musi zostać zaktualizowanyTabela odczytywana częściej niż zapisywana
Miejsce na dyskuIndeks obejmujący wszystkie kolumny podwaja rozmiar tabeliNigdy — to sygnał błędu projektowego
Kopia zapasowaDłuższy czas wykonania i odtworzeniaGdy korzyść z odczytu przewyższa koszt
Plan wykonaniaOptymalizator wybiera spośród większej liczby wariantówPrzy nielicznych, wyraźnie różnych indeksach

Ostatni wiersz bywa pomijany: przy kilkunastu podobnych indeksach serwer częściej wybiera nieoptymalny wariant, niż gdyby miał ich trzy.

Mechanizm powstawania jest zawsze ten sam. Pojawia się wolne zapytanie, ktoś zakłada indeks pod nie, problem znika. Po pół roku pojawia się kolejne, nieco inne — powstaje kolejny indeks, częściowo pokrywający się z poprzednim. Nikt nie usuwa starych, bo nie ma pewności, czy nie są używane. SQL Server udostępnia widoki systemowe pokazujące, ile razy każdy indeks został faktycznie wykorzystany od ostatniego restartu — i to od nich warto zacząć porządki, zamiast zgadywać.

Jak korzystać z tabeli w praktyce

Przy analizie sesji i utrzymaniu tej tabeli warto pamiętać o kilku sprawach:

  • Odróżniaj sesję rozłączoną od zamkniętej — pierwsza nadal zajmuje zasoby serwera aż do wygaśnięcia limitu czasu.
  • Korzystaj z kolumny IDLETIME przy ustalaniu limitu bezczynności; rozkład jej wartości pokazuje, jak faktycznie pracują użytkownicy.
  • Porównuj CLIENTIPADRESS z CLIENTREMOTEIPADRESS, żeby odróżnić połączenia z sieci firmowej od zewnętrznych.
  • Przed usunięciem któregokolwiek indeksu sprawdź w widokach systemowych, czy jest używany — zgadywanie kończy się przywracaniem go tydzień później.
  • Archiwizuj wpisy starsze niż kilka miesięcy; przy dziewięciu indeksach objętość rośnie znacznie szybciej niż same dane.
  • Zestawiaj liczbę sesji równoległych z liczbą stanowisk licencyjnych — to najprostsza kontrola zgodności z umową.

Sesje bezczynne dłużej niż dwie godziny, wciąż utrzymywane na serwerze — kandydaci do zamknięcia:

SELECT  USERNAME,
        SERVER,
        CLIENTNAME,
        CONNECTIONSTATE,
        CONNECTTIME,
        LASTINPUTTIME,
        CAST(IDLETIME AS int) AS BEZCZYNNOSC_MIN
FROM    dbo._sessionlog
WHERE   DISCONNECTTIME IS NULL
  AND   IDLETIME > 120
ORDER BY IDLETIME DESC;

Przed zamknięciem sesji warto sprawdzić kolumnę CONNECTIONSTATE — sesja rozłączona bywa świadomie pozostawiona przez użytkownika pracującego zdalnie z przerwami.

Rejestr sesji odpowiada na pytania, których nie zada się danym operacyjnym: ilu ludzi faktycznie pracuje w szczycie, ile sesji wisi bez celu i skąd łączą się użytkownicy. Przy okazji pokazuje, jak łatwo baza obrasta w indeksy, których nikt już nie potrafi uzasadnić.

Powiązane tabele i dokumentacja

Rejestr sesji uzupełnia pozostałe zapisy dotyczące dostępu i wykorzystania systemu:

FAQ

Najczęściej zadawane pytania o tabelę _sessionlog

01

Czym sesja rozłączona różni się od zamkniętej?

Rozłączenie oznacza, że użytkownik zamknął okno pulpitu zdalnego, ale jego sesja nadal istnieje na serwerze wraz z otwartymi programami i zajmowaną pamięcią. Dopiero wygaśnięcie limitu czasu albo wylogowanie zwalnia zasoby. Przy licencji liczonej stanowiskami sesja rozłączona nadal je zajmuje.

02

Po co dwa adresy IP klienta?

CLIENTIPADRESS to adres w sieci lokalnej stanowiska, CLIENTREMOTEIPADRESS — adres publiczny, z którego połączenie dociera do serwera. Porównanie obu pozwala odróżnić pracę z biura od zdalnej, co bywa istotne zarówno przy rozliczaniu licencji, jak i przy kontroli bezpieczeństwa.

03

Czy dziewięć indeksów na jednej tabeli to problem?

W tym przypadku tak. Dwa z nich obejmują niemal wszystkie kolumny, czyli są w praktyce drugą kopią danych — podwajają zajmowane miejsce i wydłużają każdy zapis. Kilka pozostałych pokrywa się zakresem. Zanim jednak cokolwiek usunąć, trzeba sprawdzić w widokach systemowych SQL Server, które z nich są faktycznie używane.

04

Jak ustalić właściwy limit bezczynności?

Z rozkładu wartości w kolumnie IDLETIME. Warto sprawdzić, jak długie przerwy występują w normalnej pracy — bo limit krótszy od nich będzie rozłączał ludzi w trakcie zadań. Typowy wynik dla magazynu to przerwy kilkunastominutowe, co pozwala ustawić limit na poziomie godziny bez uciążliwości dla użytkowników.

Słownik pojęć

Słownik pojęć

Pojęcia związane z dostępem zdalnym i wydajnością bazy danych.

MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.
MModel licencjonowania
Zasady odpłatności za oprogramowanie: licencja wieczysta z opłatą wdrożeniową albo abonament obejmujący aktualizacje i wsparcie.
WWydajność zapytań
Czas, w jakim baza danych zwraca wynik. Zależy od indeksów, planu wykonania i objętości przetwarzanych danych.
KKopia zapasowa
Zabezpieczona kopia bazy danych pozwalająca odtworzyć stan systemu po awarii. W SQL Server wykonuje się ją w trybie pełnym, różnicowym lub jako kopię dziennika transakcji.
RRole i uprawnienia
Mechanizm przypisywania użytkownikom dostępu do funkcji i danych. Zamiast nadawać uprawnienia pojedynczo, przypisuje się je do roli odpowiadającej stanowisku.
ŚŚlad rewizyjny
Nieusuwalny zapis, kto i kiedy zmienił dane w systemie. Podstawa wiarygodności ewidencji podczas audytu i kontroli.
IInstalacja lokalna
Wdrożenie na serwerze należącym do klienta, w jego sieci. Daje pełną kontrolę nad danymi, ale przenosi na firmę odpowiedzialność za kopie zapasowe i dostępność.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.