Tworzenie baz danych Stworzenie bazy danych Najprostsze polecenie: CREATE DATABASE baza Tworzy się dokładna kopia bazy model C:\...\Data\baza.mdf C:\...\Data\baza.ldf Pliki danych CREATE DATABASE baza ON (NAME=nazwa, FILENAME= nazwa_pliku, SIZE=10MB, MAXSIZE = 20MB UNLIMITED FILEGROWTH = 20% 2MB),... LOG ON (NAME=nazwa, FILENAME= nazwa_pliku, SIZE=10MB, MAXSIZE = 20MB UNLIMITED FILEGROWTH = 20% 2MB),... 1
Po co nam dziennik? 1 Modyfikacja danych 3 Zapis zmiany do logu Cache Disk 2 Strony są odczytywane z dysku Disk 4 Zapis zmiany do bazy Działanie dziennika (logu) Wszystkie zmiany danych są zapisywane najpierw w pliku logu Każdy wpis przyporządkowany jest transakcji Miejsca rozpoczęcia i zakończenia transakcji są zapisywane w logu CHECKPOINT to miejsce w logu od którego zmiany nie zostały zapisane na dysk Zapis zmian danych do pliku powoduje zmianę położenia CHECKPOINTU W razie awarii rollback nie zakończonych i rollforward zakończonych transakcji Budowa plików z danymi Page (strona) 8kB Extent 8 kolejnych stron Uniform extent zawiera strony tylko jednego obiektu Mixed extent zawiera strony należące do różnych obiektów 2
Początek pliku Header PFS GAM SGAM Page0: File Header nazwa logiczna, parametry zmiany rozmiaru itp. Page1: PFS (Page Free Space) bajt o każdej stronie (8000 pierwszych stron 64MB) Page2: GAM (Global Allocation Map) bit na każdy extent zajęty czy wolny (64k extentów = 2GB) Page3: SGAM (Shared Global Allocation Map) bit na każdy extent czy są wolne strony (64k extentów = 2GB) Znaczenie bitów GAM i SGAM Zawartość extentu Bit GAM Bit SGAM Wolny 1 0 Uniform lub pełny 0 0 Mixed z wolnymi stronami 0 1 Przydziały obiektów Strona IAM (Index Allocation Map) "Wejście" do obiektu Wskaźniki na pierwsze 8 stron Bitmapa zajętości extentów (pokrywa 512 tys. stron) 3
Maksymalne... Baz na serwerze 32.767 Wielkość bazy 1.048.516 TB Plików w bazie 32.767 Wielkość pliku 32 TB Obiektów w bazie (tables, views, stored procedures, extended stored procedures, triggers, rules, defaults, and constraints) Kolumn w tabeli 1024 2.147.483.647 Organizacja bazy danych Primary Filegroup Baza danych Filegroup Log Log File.mdf File.ndf File.ndf File.ndf Podział na grupy plików CREATE DATABASE baza ON PRIMARY (NAME=nazwa,FILENAME= nazwa_pliku,size=10mb,maxsize=20mb FILEGROWTH = 20%), (NAME=nazwa,FILENAME= nazwa_pliku,size=10mb,maxsize=20mb FILEGROWTH = 20%), FILEGROUP fg1 ( (NAME=nazwa,FILENAME= nazwa_pliku,size=10mb,maxsize=20mb FILEGROWTH = 20%), (NAME=nazwa,FILENAME= nazwa_pliku,size=10mb,maxsize=20mb FILEGROWTH=20%)) 4
Rodzaje grup PRIMARY tu umieszczane są wszystkie obiekty systemowe User-defined tu umieszczane są obiekty dla których zdefiniowano właściwość ON filegroup CREATE TABLE tablica (pole1 int,pole2 int) ON fg1; DEFAULT obiekty dla których nie zdefiniowano ON Dodanie grupy ALTER DATABASE baza ADD FILEGROUP newfg GO ALTER DATABASE baza ADD FILE (NAME = mojnowyplik', FILENAME = 'c:\...\plik.ndf, SIZE = 5MB) TO FILEGROUP newfg GO Po co więcej plików? Zwiększenie wydajności szybszy dostęp gdy więcej dysków Ułatwienie obsługi małe pliki łatwiej używać kopie tylko niektórych plików Podwyższenie bezpieczeństwa danych pliki read only Ochrona danych systemowych osobny plik na dane systemowe 5
Parametry bazy danych Auto options Cursor options Recovery options SQL options State options Auto options AUTO_CLOSE AUTO_CREATE_STATISTICS AUTO_UPDATE_STATISTICS AUTO_SHRINK Cursor options CURSOR_CLOSE_ON_COMMIT CURSOR_DEFAULT [LOCAL GLOBAL] 6
Recovery options RECOVERY FULL BULK_LOGGED SIMPLE PAGE_VERIFY CHECKSUM TORN_PAGE_DETECTION NONE Snapshot isolation (2k5) ALLOW_SNAPSHOT_ISOLATION ON: dozwolony poziom izolacji SNAPSHOT w którym transakcja widzi dane takie jak przy starcie transakcji OFF: poziom izolacji SNAPSHOT nie jest dozwolony READ_COMMITTED_SNAPSHOT ON: transakcja na poziomie READ COMMITTED widzi dane takie jak przy starcie transakcji OFF: transakcja na poziomie READ COMMITTED blokuje się przy brudnym odczycie SQL options ANSI_NULL_DEFAULT domyślnie kolumna ma NULL/NOT NULL ANSI_NULLS ON: porównania z NULL zawsze dają UNKNOWN OFF: porównanie z NULL danej o wartości NULL daje TRUE ANSI_PADDING ON: nie obcina automatycznie końcowych spacji w polach varchar OFF: obcina automatycznie końcowe spacje w polach varchar ANSI_WARNINGS ON 7
SQL options ANSI_WARNINGS ON: Ostrzeżenia przy dzieleniu przez zero ARITHABORT arithmetic abort przerywa wykonanie zapytania NUMERIC_ROUNDABORT błąd przy utracie precyzji w wyrażeniu CONCAT_NULL_YIELDS_NULL ON: łączenie (konkatenacja) łańcuchów z NULL daje NULL OFF: łańcuch NULL jest traktowany jak pusty RECURSIVE_TRIGGERS QUOTED_IDENTIFIER -- to się nie uda! SET QUOTED_IDENTIFIER OFF CREATE TABLE "select" ("identity" int IDENTITY, "order" int) -- to się uda SET QUOTED_IDENTIFIER ON CREATE TABLE "select" ("identity" int IDENTITY, "order" int) SELECT "identity","order" FROM "select" ORDER BY "order" -- to się uda zawsze CREATE TABLE [select] ([identity] int IDENTITY, [order] int) SELECT [identity],[order] FROM [select] ORDER BY [order] -- ale nie jest to dobry pomysł! State options ON_LINE OFF_LINE EMERGENCY READ_ONLY READ_WRITE SINGLE_ USER RESTRICTED_ USER MULTI_USER 8
Warunek wykonania zmiany WITH <termination> WAIT (domyślnie) czekaj aż aktualne transakcje się zakończą ROLLBACK AFTER 10 [SECONDS] poczekaj N sekund i wyrzuć wszystkie transakcje ROLLBACK IMMEDIATE wyrzuć wszystkie transakcje NO_WAIT jeśli są transakcje poddaj się Przykłady poleceń ALTER DATABASE baza SET QUOTED_IDENTIFIER ON, RECOVERY FULL, MULTI_USER GO ALTER DATABASE baza SET SINGLE_USER WITH ROLLBACK AFTER 10 GO Typy danych Liczbowe Całkowite Dokładne numeryczne Zmiennoprzecinkowe Walutowe Data i czas Tekstowe BLOB Specjalne 9
Typy liczbowe int 4 bigint 8 smallint 2 tinyint 1 decimal(p[,s]) 2-17 numeric (p[,s]) 2-17 float(n) n(1-24) 7 cyfr mantysy 4B n(25-53) 15 cyfr mantysy 8B real 4 money 8 smallmoney 4 Typy datowe i tekstowe datetime 8 smalldatetime 4 char(n) 0-8000 varchar(n) 0-8000 nchar(n) 0-8000 (4000 znaków!) nvarchar(n) 0-8000 (4000 znaków!) binary 0-8000 varbinary 0-8000 Pozostałe typy image 0-2 GB text 0-2 GB ntext 0-2 GB uniqueidentifier 16 bit 1 timestamp 8 sql_variant do 8000 SQL2K5 nowy typ: xml 10
Definiowanie własnych typów Stworzenie typu EXEC sp_addtype nazwisko, 'nvarchar(25)', NULL Usunięcie typu EXEC sp_droptype nazwisko Organizacja wiersza danych Nagłówek Pola o stałej długości Null Block Variable Block Pola o zmiennej długości Nagłówek 4 bajty jy Null block 2B na ilość kolumn, Null Bitmap (1 bit na kolumnę mówiący czy kolumna jest pusta) Variable block 2B na ilość kolumn, po 2B na kolumnę zawierające wskaźnik na koniec wartości Max długość wiersza 8060 B Przechowywanie BLOB Specjalne struktury drzewiaste Można zdefiniować jak duże mają się mieścić w wierszu. EXEC sp_tableoption 'tablica', 'text in row', '1000' Max wielkość wiersza: 8060 B. Duże BLOBy są przechowywane jako wskaźniki (16B) 11
Kolumna IDENTITY Jedna w tablicy Definicja: IDENTITY[(seed,incr)] CREATE TABLE pracownicy ( nr_prac int IDENTITY(100,1), nazwisko varchar(30))) insert into pracownicy values ( Kowalski ); insert into pracownicy values ( Nowak ); insert into pracownicy values ( Iksiński ); nr_prac nazwisko ----------- ---------- 100 Kowalski 101 Nowak 102 Iksiński Kontrola IDENTITY select IDENT_CURRENT('tablica') globalnie najwyższa wartość kolumny select @@identity from tablica ostatnia wartość wpisana w tej sesji (NULL jeśli nic nie było wpisane) select SCOPE_IDENTITY() ostatnia wstawiona wartość IDENTITY (do dowolnej tabeli) w tym zakresie select IDENT_SEED( tablica ) select IDENT_INCR( tablica ) Wyłączanie IDENTITY CREATE TABLE pracownicy ( nrp int IDENTITY(100,1), nazw varchar(30))) insert into pracownicy values ( Kowalski ); SET IDENTITY_ INSERT pracownicy ON insert into pracownicy(nrp,nazw) values (200, Nowak ); SET IDENTITY_INSERT pracownicy OFF insert into pracownicy values ( Iksiński ); nr_prac nazwisko ----------- ---------- 100 Kowalski 200 Nowak 201 Iksiński 12
Nieunikalne IDENTITY CREATE TABLE pracownicy ( nrp int IDENTITY(100,1), nazw varchar(30))) insert into pracownicy values ( Kowalski ); insert into pracownicy values ( Iksiński ); SET IDENTITY_INSERT pracownicy ON insert into pracownicy(nrp,nazw) values (100, Nowak ); SET IDENTITY_INSERT pracownicy OFF nr_prac nazwisko ----------- ---------- 100 Kowalski 101 Iksiński 100 Nowak Typ uniqueidentifier 16B (128b) - unikalny GLOBALNIE (GUID) CREATE TABLE pracownicy ( nrp uniqueidentifier NOT NULL DEFAULT newid(), nazw varchar(30))) insert into pracownicy(nazw) values ( Kowalski ); insert into pracownicy(nazw) values ( Iksiński ); insert into pracownicy(nazw) values ( Nowak ); nr_prac nazwisko ------------------------------------ ---------- 075860D6-FBAC-466E-A0F5-5EAF0D69543B Kowalski A5B7C0BD-0F23-4F79-9758-AF35A6D20D3D Iksiński FF8BEBC6-21F8-46A1-8108-8507BA9509E0 Nowak Typ timestamp (rowversion) CREATE TABLE tt (a int, b timestamp) insert into tt(a) values (1); insert into tt(a,b) values(2,null) a b ----------- ------------------ 1 0x00000000000000CC 2 0x00000000000000CD update tt set a=3 where a=1 a b ----------- ------------------ 3 0x00000000000000CF 2 0x00000000000000CD 13
Ograniczenia - CONSTRAINTS Default Check Primary Key Unique Foreign Key CREATE DEFAULT Default constraints Nie dla IDENTITY Działa tylko przy instertach Można użyć zmiennych lub funkcji systemowych: newid(), user, getdate() CREATE TABLE tablica( tekst varchar(50), wpisal varchar(30) default user, data_wpisu datetime default getdate() ) insert into tablica(tekst) values( Nowy tekst ) tekst wpisal data_wpisu ------------ ---------------- ----------------------- Nowy tekst pawel 2005-10-10 20:52:02.513 Check constraint Działa przy każdej zmianie danych CREATE TABLE pracownicy( pensja int check (pensja>0), data_ur datetime, opis varchar(50), constraint data_mniejsza check(data_ur<getdate())) insert into pracownicy values(10, 2100, ) INSERT statement conflicted with COLUMN CHECK constraint 'data_mniejsza'. insert into pracownicy values(-10, 1980, ) INSERT statement conflicted with COLUMN CHECK constraint 'CK pracownic pensj 7E6CC920'. 14
Check constraint Może dotyczyć więcej niż 1 kolumny CREATE TABLE projekty ( start datetime, koniec datetime, constraint t koniec_po_starcie i check (start<koniec)) t<k Można użyć wyrażeń logicznych ALTER TABLE tablica ADD CONSTRAINT dataur CHECK (dataur>'01-01-1900' AND dataur<getdate()) Check constraint Można używać wzorców CREATE TABLE adresy ( miasto varchar(30), kod char(6) check(kod LIKE '[0-9][0-9]-[0-9][0-9][0-9]'), ulica varchar(40) check(ulica like '[a-z]%[0-9]') ) insert into adresy values( Gliwice','22-445', Ala 6') insert into adresy values( Gliwice','22-44', Ala 6') insert into adresy values( Gliwice','22-442', 5Ala 6') insert into adresy values( Gliwice','22-442', 5 Ewa') NOCHECK Nie sprawdza warunków na już wpisanych wierszach CREATE TABLE tablica ( a INT); INSERT INTO tablica VALUES (-1); ALTER TABLE tablica ADD CONSTRAINT mycheck CHECK (a > 1); ALTER TABLE statement conflicted with COLUMN CHECK constraint 'mycheck'. ALTER TABLE tablica WITH NOCHECK ADD CONSTRAINT mycheck CHECK (a > 1); The command(s) completed successfully. 15
Primary key Jeden w tabeli (może być kilka kolumn) Automatycznie tworzy się indeks CREATE TABLE tablica ( a INT [[NON]CLUSTERED] PRIMARY KEY, b varchar(20)); CREATE TABLE tablica ( a INT, b varchar(20), PRIMARY KEY (a)); ALTER TABLE tablica ADD CONSTRAINT primary_key PRIMARY KEY NONCLUSTERED (a); Unique Może mieć jedną wartość NULL Może być więcej kolumn w tablicy Nie można dla kolumn należących ą do PK Automatycznie tworzy się indeks Foreign key Nie ma SET NULL Może być więcej kolumn w tablicy Można dodać WITH NOCHECK CREATE TABLE tablica ( a INT, b varchar(20), PRIMARY KEY (a,b)); CREATE TABLE tab2( x int, y varchar(20), foreign key (x,y) references tablica(a,b) on update cascade); 16
Wyłączanie sprawdzania Przy ładowaniu dużych ilości danych Gdy wiadomo, że spełniają warunki Gdy nie spełniają ale wygodniej jest je poprawić w bazie ALTER TABLE tablica NOCHECK CONSTRAINT mój_warunek... Ładowanie danych... ALTER TABLE tablica CHECK CONSTRAINT mój_warunek CREATE DEFAULT Jedna definicja używana w różnych miejscach (także w typach użytkownika) CREATE DEFAULT mojkraj AS Polska sp_bindefault mojkraj, pracownicy.kraj' sp_bindefault mojkraj, studenci.kraj' sp_bindefault mojkraj, adresy.kraj' Wyłączanie default sp_unbindefault mojkraj, adresy.kraj' Kolumny wyliczane (computed) create table prac(nrp int, adr_domowy varchar(30), adr_praca varchar(30), koresp int, adr_koresp as CASE koresp WHEN 0 THEN adr_domowy ELSE adr_praca END ) insert into prac values(1,'chorzów','gliwice',0) select * from prac nrp adr_domowy adr_praca koresp adr_koresp --- ------------ ----------- ------ ----------- 1 Chorzów Gliwice 0 Chorzów update prac set koresp=1 select * from prac nrp adr_domowy adr_praca koresp adr_koresp --- ------------ ----------- ------ ----------- 1 Chorzów Gliwice 1 Gliwice 17
Sposób zapisu danych Wiersz może zajmować tylko 1 stronę Na stronie może być więcej wierszy Strona IAM przechowuje informacje które strony i extenty w pliku należą do obiektu Adres pierwszej strony IAM każdego obiektu jest w tablicy sysindexes Dostęp do danych Table scan Clustered index Nonclustered index (max. 249 różnych indeksów) Sposób działania indeksów Sposob działania B-drzewa (root, node, leaf) Indeksy clustered liście to bezpośrednio dane Indeksy nonclustered liście to wskaźniki na dane: <file_id:page_no:row_no> id:page no> 18
Obiekty w sysindexes Dane: Heap - tablica bez indeksu (indid=0) Clustered table tablica poindeksowana indeksem clustered (indid=1) Nonclustered indexes indeks jakiejś tablicy (indid=2..249) BLOB (text, image) łańcuch obiektów (indid=250) Indeksy clustered (CL) i nonclustered (NCL) Wyszukiwanie według indeksu NCL w tabeli, która ma indeks CL: Znajdź w drzewie NC wartość odpowiadającego klucza CL Znajdź w drzewie CL szukany rekord create table prac (nrp int primary key, nazwisko char(10)) create index inazw on prac(nazwisko) select * from prac where nazwisko= Kowalski Zalety i wady indeksów Zalety: Przyspieszają wyszukiwanie danych Mogą wymuszać unkalność danych Wady: Spowalniają wprowadzanie danych Spowalniają zmianę indeksowanych danych Zajmują miejsce (ilość zależy od wielkości pola indeksowanego) Utrudniają administrację bazą 19
Modyfikacje danych CL Dodawanie wierszy Jeśli to konieczne to podział strony Strony lista dwukierunkowa Modyfikacje wierszy (pola indeksowanego) Fizyczne przenoszenie rekordów między stronami Usuwanie wierszy łączenie stron Indeksy NCL Tylko ewentualne zmiany odnośników do CL Modyfikacje danych Heap Dodawanie wierszy Jeśli to konieczne to tworzenie nowej strony Modyfikacje wierszy - bezpośrednio Usuwanie wierszy powstaje miejsce do wykorzytania Indeksy NCL Forwarding Pointers Zmiany tylko na stronach indeksu Tworzenie indeksów Tworzenie indeksu create index nazwa on tablica(kolumna,...) create unique index nazwa on tablica(kolumna,...) create clustered index nazwa on tablica(kolumna,...) l create unique clustered index nazwa on tablica(kolumna,...) Usuwanie indeksu drop index tablica.nazwa 20
Zasady tworzenia indeksów Lepiej używać PK i UNIQUE Najpierw clustered Nie duplikować indeksów! Pola indeksowane powinny być małe Używać UNIQUE jeśli to możliwe SELECT id, COUNT(*) FROM tablica GROUP BY id HAVING COUNT(*)>1 Indeksy złożone (composite) Maksymalnie 16 kolumn (900 bajtów) Kolejność ma znaczenie! create index xyz on prac(nazw,imie) create index xyz on prac(imie,nazw) Najlepiej najpierw kolumnę bardziej unikalną Indeks jest używany tylko gdy zapytanie zawiera we frazie WHERE jego pierwszą kolumnę! Opcja FILLFACTOR Określa jak wypełnić strony Domyślnie 100% Zmniejszanie wartości zwiększa zajętość dysku ale przyspiesza operacje insert i update Bez PAD_INDEX dotyczy tylko liści create index xyz on prac(nazw,imie) with [PAD_INDEX,] FILLFACTOR=70 21
Program DBCC DBCC Database Consistency Checker Program wykonujący około 130 różnych operacji DBCC checkdb DBCC cleantable DBCC perflog DBCC showcontig DBCCC indexdefrag DBCC showcontig DBCC SHOWCONTIG scanning 'tablica' table... Table: 'tablica' (2073058421); index ID: 1, database ID: 6 TABLE level scan performed. Pages Scanned: 3 Extents Scanned: 2 Extent Switches: 1 Avg. Pages per Extent: 1.5 Scan Density [Best Count:Actual Count]: 50.00% [1:2] Logical Scan Fragmentation 0.00% Extent Scan Fragmentation: 50.00% Avg. Bytes Free per Page: 246.7 Avg. Page Density (full): 96.95% DBCC execution completed. If DBCC printed error messages, contact your system administrator. 22