Microsoft SQL Server 2008     Co nowego w silniku bazodanowym SQL Server 2008 July CTP (CTP 4), cz. II

Co nowego w silniku bazodanowym SQL Server 2008 July CTP (CTP 4), cz. I Udostępnij na: Facebook

Autor: Paweł Potasiński

Opublikowano: 6 września 2007

Zawartość strony
Wstęp  Wstęp
Typy danych do obsługi daty i czasu  Typy danych do obsługi daty i czasu
Wsparcie dla obsługi hierarchii  Wsparcie dla obsługi hierarchii
Performance Data Collection  Performance Data Collection

Wstęp

Z końcem lipca firma Microsoft udostępniła użytkownikom kolejną wersję najnowszego systemu zarządzania bazami danych – Microsoft SQL Server 2008 July CTP (CTP – Community Preview), wersję nazywaną także CTP 4. Wersja ta została wzbogacona o nowe ciekawe funkcjonalności silnika bazodanowego. Niektóre z nowości były długo wyczekiwane przez administratorów i programistów systemu SQL Server. Celem niniejszego artykułu jest ogólne przedstawienie (nie zaś kompletny opis) najważniejszych nowych możliwości silnika bazodanowego dodanych w CTP 4.

Uwaga

Ponieważ Microsoft SQL Server 2008 July CTP jest wersją rozwojową systemu, firma Microsoft nie gwarantuje, że opisane w artykule funkcjonalności znajdą się w wersji finalnej systemu w takiej postaci, jak to przedstawiono w tekście. Nie ma również gwarancji, że owe funkcjonalności w ogóle znajdą się w wersji finalnej.

 

 

 Do początku strony Do początku strony

Typy danych do obsługi daty i czasu

Prawdopodobnie największą rewelacją wersji CTP 4 jest dodanie nowych typów danych do przechowywania daty i czasu. Do tej pory Microsoft SQL Server umożliwiał wykorzystanie dwóch typów danych związanych z datą i czasem: datetime i smalldatetime. Oba wymienione typy danych mają liczne niedoskonałości i braki:

  • brak możliwości przechowywania tylko daty / tylko czasu – zarówno datetime, jak i smalldatetime przechowują i datę, i czas,
  • maksymalna dokładność czasu do 3 i 1/3 milisekundy (typ datetime),
  • maksymalna dokładność czasu do 3 i 1/3 milisekundy (typ datetime),
  • brak obsługi stref czasowych (nie licząc funkcji GETUTCDATE, zwracającej datę i czas w oparciu o ustawienia strefy czasowej dla systemu operacyjnego),
  • interpretacja literałów daty i czasu w zależności od ustawień językowych sesji.

Powyższe czynniki wpłynęły na to, że Microsoft SQL Server 2008 July CTP został wyposażony w cztery nowe typy danych do obsługi daty i czasu:

  • date – umożliwia przechowywanie na 3 bajtach (typ stałego rozmiaru) daty od 1 stycznia 1 roku n.e. do 31 grudnia 9999 według kalendarza gregoriańskiego; używa domyślnie formatu standardowego ISO-8601 czyli RRRR-MM-DD ,
  • time – umożliwia przechowywanie na 5 bajtach (typ stałego rozmiaru) czasu bez daty według zegara 24-godzinnego; nie obsługuje stref czasowych; pozwala na określenie dokładności, z jaką będzie przechowywany czas (deklaracja typu time(7) oznacza, że dokładność będzie do 7 miejsc po przecinku po sekundach, czyli do 100 nanosekund – jest to maksymalna dokładność czasu w CTP 4); używa domyślnego formatu GG:MM:SS[.NNNNNNN], gdzie: GG– godziny, MM – minuty, SS – sekundy, NNNNNNN – opcjonalnie części ułamkowe sekund (maksymalna precyzja do 7 cyfr),
  • datetime2 – umożliwia przechowywanie na 8 bajtach (typ stałego rozmiaru) daty od 1 stycznia 1 roku n.e. do 31 grudnia 9999 według kalendarza gregoriańskiego i czasu według zegara 24-godzinnego z dokładnością maksymalną do 100 nanosekund; pozwala na określenie dokładności, z jaką będzie przechowywany czas (datetime2(n) - patrz opis typu time); używa domyślnie formatu RRRR-MM-DD GG:MM:SS.[NNNNNNN] (patrz wcześniej opisane typy date i time),
  • datetimeoffset – umożliwia przechowywanie na 8 bajtach (typ stałego rozmiaru) daty od 1 stycznia 1 roku n.e. do 31 grudnia 9999 według kalendarza gregoriańskiego, czasu według zegara 24-godzinnego z dokładnością maksymalną do 100 nanosekund i przesunięcia strefy czasowej; pozwala na określenie dokładności, z jaką będzie przechowywany czas (datetimeoffset(n) - patrz opis typu time); używa domyślnie formatu RRRR-MM-DD GG:MM:SS.[NNNNNNN] [±GG:MM], gdzie ±GG:MM oznacza przesunięcie strefy czasowej (GG – godziny, MM – minuty).

Oprócz nowych typów danych programiści Microsoft dodali także funkcje systemowe wspomagające nowe typy danych. Funkcje te to:

  • SYSDATETIME – zwraca aktualną datę systemową i czas jako wartość typu datetime2,
  • SYSDATETIMEOFFSET – zwraca aktualną datę systemową i czas jako wartość typu datetimeoffset,
  • SYSUTCDATETIME – zwraca aktualną datę systemową i czas UTC (Universal Time Coordinated) jako wartość typu datetime2,
  • SWITCHOFFSET – pozwala zmienić przesunięcie czasowe dla wielkości typu datetimeoffset,
  • TODATETIMEOFFSET – pozwala przekonwertować dowolny wielkość dowolnego typu danych obsługującego datę i czas do typu danych datetimeoffset z wybranym przesunięciem czasowym.

Przykłady:

-- date

DECLARE @date date

SET @date = '2001-02-03'

SELECT @date AS Data

Data

----------

2001-02-03

-- time

DECLARE @time time(2)

SET @time = '2:30:59'

SELECT @time AS Czas

Czas

-----------

02:30:59.00

-- datetime2

DECLARE @datetime2 datetime2(5)

SET @datetime2 = SYSDATETIME()

SELECT @datetime2 AS [Data i czas]

Data i czas

-------------------------

2007-08-23 22:01:29.17345

-- datetimeoffset

DECLARE @datetimeoffset datetimeoffset(2)

SET @datetimeoffset = SYSDATETIMEOFFSET()

SELECT @datetimeoffset AS [Data i czas +/- offset]

Data i czas +/- offset

-----------------------------

2007-08-23 22:07:40.86 -07:00

 Do początku strony Do początku strony

Wsparcie dla obsługi hierarchii

Kolejnym, po typach służących do obsługi daty i czasu, nowym typem danych jest hierarchyid. Został on stworzony z użyciem technologii .NET (wykorzystuje integrację systemu SQL Server ze środowiskiem uruchomieniowym CLR). Typ ten wspiera obsługę danych hierarchicznych, takich jak hierarchie pracowników w firmie. W poprzednich wersjach systemu SQL Server obsłużenie danych hierarchicznych wiązało się ze sporym nakładem pracy programistów. Microsoft SQL Server 2005 oferuje wiele nowych mechanizmów przyspieszających pracę programistów, jak Common Table Expressions czy funkcje rankingu. W Microsoft SQL Server 2008 July CTP grupa programistów firmy Microsoft poszła dalej. Typ hierarchyid oferuje nowe podejście. W kolumnie tego typu można przechowywać zapisaną w specjalnym formacie pozycję rekordu w drzewie hierarchii (wpisywana jako napis pozycja przechowywana w zbinaryzowanej postaci). Typ został wyposażony w zestaw metod, które umożliwiają sprawne poruszanie się po drzewie hierarchii. Niektóre z tych funkcji zostaną użyte w przykładzie w dalszej części artykułu.

W poniższym przykładzie w tymczasowej tabeli znajduje się kolumna typu hierarchyid. Wartości wstawiane w tę kolumnę mają postać liczb (niekoniecznie całkowitych) oddzielonych ukośnikiem. Każda liczba oznacza pozycję, jaką dany rekord zajmuje w drzewie hierarchii na danym poziomie. I tak na przykład hierarchyid „/” oznacza, że dany rekord nie ma rekordu-rodzica, zaś „/1/1/” oznacza, że rekord znajduje się na drugim od góry poziomie drzewa i jego rodzicem jest rekord oznaczony wartością hierarchyid równą „/1/”.

Metoda GetAncestor pozwala na uzyskanie hierarchyid dowolnego przodka (rekordu, do którego można przejść od bieżącego rekordu idąc „w górę” drzewa).

Metoda GetDescendant pozwala na uzyskanie dowolnego potomka (rekordu, do którego można przejść od bieżącego rekordu idąc „w dół” drzewa).

Metoda GetLevel pozwala na uzyskanie głębokości, na jakiej znajduje się rekord w drzewie hierarchii.

Poniższy fragment kodu zawiera przykład wykorzystania typu hierarchyid do przechowywania struktury firmy.

CREATE TABLE #Hierarchy

(

    EmployeeName nvarchar(20) not null,

    EmployeeHierarchyID hierarchyid not null

)

GO

INSERT #Hierarchy VALUES ('John Smith','/')

INSERT #Hierarchy VALUES ('Alice Cooper','/1/')

INSERT #Hierarchy VALUES ('Steve Nash','/1/1/')

INSERT #Hierarchy VALUES ('Debbie Walker','/1/2/')

SELECT 

    H1.EmployeeName, 

    H1.EmployeeHierarchyID.ToString() AS [HierarchyID], 

    ISNULL(H2.EmployeeName,'-') AS BossName, 

    ISNULL(H3.EmployeeName,'-') AS FirstChildName,

    H1.EmployeeHierarchyID.GetLevel() AS Level

FROM #Hierarchy H1

LEFT JOIN #Hierarchy H2

ON H1.EmployeeHierarchyID.GetAncestor(1) = H2.EmployeeHierarchyID

LEFT JOIN #Hierarchy H3

ON H1.EmployeeHierarchyID.GetDescendant(NULL,NULL) = H3.EmployeeHierarchyID
EmployeeNameHierarchyIDBossNameFirstChildNameLevel
John Smith/-Alice Cooper0
Alice Cooper/1/John SmithSteve Nash1
Steve Nash/1/1/Alice Cooper-2
Debbie Walker/1/2/Alice Cooper-2

 Do początku strony Do początku strony

Performance Data Collection

Do sporej gamy dostępnych w poprzednich wersjach systemu narzędzi służących do monitorowania serwera firma Microsoft dokłada w CTP 4 kolejne – Performance Data Collection. Mechanizm ten, zintegrowany z usługą SQL Server Agent i platformą SQL Server Integration Services (SSIS), opiera swoje działanie na komponencie zwanym kolektorem danych (ang. data collector), który przechwytuje dane z wielu źródeł w SQL Server i w systemie operacyjnym, i dzięki temu może być pomocny przy rozwiązywaniu problemów wydajnościowych i przy utrzymaniu serwera. Kolektor jest instalowany wraz z instancją SQL Server (na dzień dzisiejszy instancja CTP 4 posiada jeden kolektor) i może działać przez cały czas lub być aktywowany na żądanie administratora. Kolektor może trwale przechowywać zebrane dane monitoringu w bazie danych zwanej Management Data Warehouse (MDW – bazę danych o takiej nazwie można znaleźć na instancjach CTP 4). Baza ta może zostać wykorzystana przez administratora do analizy zebranych przez kolektor danych.

Zasady funkcjonowania mechanizmu opierają się na tworzeniu (póki co tylko z poziomu kodu T-SQL) kolekcji danych, które zawierają elementy odpowiadające zapytaniom T-SQL monitorującym obiekty baz danych (np. odpytującym odpowiednie widoki dynamiczne). Dane pobierane przez zapytania zaszyte w elementach kolekcji mogą być zbierane cyklicznie lub na żądanie. Zbieranie danych odbywa się z poziomu joba usługi SQL Server Agent. Za transfery danych do tymczasowych magazynów danych oraz do bazy MDW odpowiada silnik SSIS.

Rys. 1. Schemat działania mechanizmu Performance Data Collection.

Funkcjonalności mechanizmu są następujące:

  • możliwość zdefiniowania, jakie dane będą zbierane, gdzie będą przechowywane (instancja SQL Server i baza danych dla kolektora oraz tabela dla elementu kolekcji) i w jakie kolekcje będą organizowane – kolektor może obsługiwać wiele kolekcji jednocześnie,
  • sterowanie zbiorami danych z poziomu kodu T-SQL i .NET API,
  • podgląd danych przy pomocy raportów Reporting Services w aplikacji SQL Server Management Studio,
  • możliwość dołączania własnych kolektorów (w przyszłości).

Rys. 2. Performance Data Collection w SQL Server Management Studio.

Obiekty systemowe do sterowania i monitorowania kolektorów i zbiorów danych znajdują się w bazach msdb (większość) i MDW. Ponieważ celem niniejszego artykułu nie jest dokładne opisywanie mechanizmów CTP 4, a jedynie ich ogólna prezentacja, pokaźna lista procedur, funkcji i widoków, jakich może użyć administrator do zarządzania mechanizmem kolekcjonowania danych, zostanie pominięta.

Obsługa mechanizmów Performance Data Collection z poziomu kodu T-SQL jest w CTP 4 niebanalna, czego dowodem może być poniższy fragment kodu. Wykonywane są w nim następujące czynności: ustawienie instancji i bazy danych dla kolektora (kolektor nie może być włączony), stworzenie nowej kolekcji z elementem, w którego definicji określono zapytanie do widoku dynamicznego monitorującego aktualnie założone w bazach danych blokady, uruchomienie kolekcji, wykonanie migawki danych kolekcji do bazy MDW, odpytanie tabeli zawierającej migawkę (w wyniku tej operacji oglądamy zmonitorowane dane).

USE msdb

GO

-- konfiguracja instancji i bazy dla kolektora

EXEC sp_syscollector_set_warehouse_database_name 'MDW'

EXEC sp_syscollector_set_warehouse_instance_name 'KATMAI'

DECLARE @params xml;

DECLARE @collection_item_id int;

SELECT @params = convert(xml, 

    N'<TSQLQueryCollector>

        <Query>

          <Value>SELECT * FROM sys.dm_tran_locks</Value>

          <OutputTable>locks_every_hour</OutputTable>

        </Query>

      </TSQLQueryCollector>');

-- tworzymy nową kolekcję

DECLARE @collection_set_id int

DECLARE @collection_set_uid uniqueidentifier 

SET @collection_set_uid = newid()

EXEC dbo.sp_syscollector_create_collection_set

    @schedule_uid = '626ECC53-9B90-4133-88C0-B033FF5D825B',

    @name = 'Locks Requested',

    @target = '/Server[@Name=''MSSQLSERVER'']',

    @collection_mode = 0,

    @description = 'Sample data collection catching locks requested.',

    @logging_level = 1,

    @collection_set_id = @collection_set_id OUTPUT,

    @collection_set_uid = @collection_set_uid OUTPUT

-- tworzymy nowy element kolekcji

EXEC dbo.sp_syscollector_create_collection_item

    @collection_set_id = @collection_set_id,

    @collector_type_uid = N'302E93D1-3424-4BE7-AA8E-84813ECF2419',

    @name = 'locks_every_hour',

    @frequency = 3600,

    @parameters = @params,

    @collection_item_id = @collection_item_id output;

-- startujemy kolekcję

EXEC sp_syscollector_start_collection_set 

    @collection_set_id = @collection_set_id

-- sprawdzamy obecność kolekcji i elementów

SELECT * FROM syscollector_collection_sets

SELECT * FROM syscollector_collection_items

SELECT * FROM syscollector_execution_log 

-- robimy snapshot danych z kolekcji

-- wartości parametrów zostaly pobrane 

-- z powyższych widoków systemowych

DECLARE @snapshot_id int 

EXEC MDW.core.sp_create_snapshot 

    @collection_set_uid = '99AAA915-F54F-4019-AB6F-FAE72787A0CB'

    , @collector_type_uid = '302E93D1-3424-4BE7-AA8E-84813ECF2419'

    , @log_id = 25

    , @snapshot_id = @snapshot_id OUTPUT

-- wyświetlamy dane ze snapshota z kolekcji

SELECT * FROM MDW.custom_snapshots.locks_every_hour

Poniższy rysunek przedstawia przykładowy raport Reporting Services, który prezentuje dane pochodzące z kolekcji wygenerowanej powyższym kodem. Raport taki można podłączyć do menu kontekstowego w oknie Object Explorer aplikacji Management Studio.

Rys. 3. Raport używający danych z kolekcji Performance Data Collection.

 Do początku strony Do początku strony


  Paweł Potasiński (MVP, MCT, MCDBA, MCSE, MCSD, MCITP)
Starszy programista w Asseco Business Solutions S.A. W codziennej pracy zajmuje się rozwojem aplikacji ERP oraz zagadnieniami z zakresu RD. Wykładowca akademicki na kilku uczelniach w Warszawie. Wcześniej pracował jako administrator baz danych oraz trener. Założyciel i lider Polskiej Grupy Użytkowników SQL Server. Wolontariusz organizacji GITCA wspierającej działalność grup pasjonackich IT Pro. Prelegent na licznych konferencjach krajowych i zagranicznych, m.in. European PASS Conference i Microsoft Technology Summit. Microsoft Most Valuable Professional (MVP) w kategorii SQL Server od lipca 2008 roku.
 Do początku strony Do początku strony

Microsoft SQL Server 2008     Co nowego w silniku bazodanowym SQL Server 2008 July CTP (CTP 4), cz. II