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

Opublikowano: 6 września 2007
Zawartość strony
WstępWstęp
Typy danych do obsługi daty i czasuTypy danych do obsługi daty i czasu
Wsparcie dla obsługi hierarchiiWsparcie dla obsługi hierarchii
Performance Data CollectionPerformance Data Collection
Przeczytaj pozostałe części tego artykułuPrzeczytaj pozostałe części tego artykułu

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 stronyDo 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 stronyDo 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 Cooper

0

Alice Cooper

/1/

John Smith

Steve Nash

1

Steve Nash

/1/1/

Alice Cooper

-

2

Debbie Walker

/1/2/

Alice Cooper

-

2

Do początku stronyDo 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.

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.

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.

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

Do początku stronyDo początku strony

Przeczytaj pozostałe części tego artykułu

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


Paweł Potasiński

Paweł Potasiński (Microsoft Certified Trainer, Asseco Business Solutions S.A.)
Programista i konsultant w firmie Asseco Business Solutions S.A., gdzie kontynuuje odkrywanie tajników systemów SQL Server. Wcześniej od roku 2000 prace głównie przy projektach aplikacji webowych i serwerach baz danych (m.in. SQL Server 7.0/2000). W latach 2003-2007 pracował jako szkoleniowiec w ABC Data Centrum Edukacyjne. Posiada certyfikaty firmy Microsoft, m.in.: MCDBA, MCSE, MCSD, MCITP i MCT.


Do początku stronyDo początku strony