Jako programista dobrze wiesz w jakich strukturach – listach, słownikach, posortowanych listach, … - chcesz umieścić dane w pamięci tak, aby Twój kod był efektywny. Przełożymy te dobrze znane nam struktury na świat relacyjnych baz danych i zgłębimy czemu naprawdę odpowiadają struktury bazodanowe – tabele, różne rodzaje indeksów, partycje, statystyki, itp. Co z tego wynika dla programisty i jak w związku z tym lepiej wykorzystać dostępne zasoby sprzętowe. Powiemy też jakich zadań administracyjnych te struktury wymagają, a których brak może po pewnym czasie bardzo zaszkodzić naszej aplikacji. Skupię się na Microsoft SQL Server, jednak bez problemu przetłumaczycie użyte terminy na dowolny silnik bazodanowy.
2. WWW.HIGHWHEELSOFTWARE.COM 2
O prowadzącym
• Programista .NET od 2005 roku
• Architekt hurtowni danych (Microsoft SQL Server)
• Współwłaściciel
• Miłośnik:
• Automatyzacji
• Czytelnego kodu
• LEAN Software Development / Agile
5. WWW.HIGHWHEELSOFTWARE.COM 5
Nośnik danych
• Dane na dysku
• Zapis / odczyt stronami (page) – 8kB
• Typy stron:
• dane,
• indeksy,
• ‚blob’ – dane binarne, długie teksty,
• (oraz różne techniczne)
Plik
Grupa
plików
Baza
Pole Wiersz Strona Partycja
Obiekt
BD
Baza
6. WWW.HIGHWHEELSOFTWARE.COM 6
Dwa ułożenia danych
Sterta (Heap)
LinkedList<Row>
ICollection<Row>
B-drzewo
SortedDictionary<Key,LinkedList<Row>>
IDictionary<Key,ICollection<Row>>
http://guide.couchdb.org/draft/btree.html
7. WWW.HIGHWHEELSOFTWARE.COM 7
Dwa ułożenia danych (2)
Sterta
+ Brak narzutu, prostota
+ Zrównoleglenie operacji
- Wyszukanie elementu O(n)
B-drzewo
http://guide.couchdb.org/draft/btree.html
+Wyszukanie po kluczu O(log n)
- Ograniczone zrównoleglenie
- Dodatkowe strony
10. WWW.HIGHWHEELSOFTWARE.COM 10
Czym jest indeks?
Indeks to B-drzewo ☺
• Klastrowany (clustered)
• główna struktura przechowywania danych jest B-drzewem
• Nieklastrowany (nonclustered)
• dodatkowa struktura obok głównej sterty / B-drzewa
• zawiera kopię części danych
11. WWW.HIGHWHEELSOFTWARE.COM 11
Tabelka – przykład C#
CREATE TABLE Customers (
nr int not null,
name nvarchar(50),
country nvarchar(50)
);
public class Customer {
public int nr;
public string name;
public string country;
}
public interface CustomersTable {
ICollection<Customer> Data { get; }
}
12. WWW.HIGHWHEELSOFTWARE.COM 12
Indeksy – NONCLUSTERED i sterta
CREATE TABLE Customers (
nr int not null,
name nvarchar(50),
country nvarchar(50)
);
CREATE NONCLUSTERED INDEX ByCountry
ON Customers (Country);
public class Customer {
public int nr;
public string name;
public string country;
}
public interface CustomersTable {
ICollection<Customer> Data { get; }
IDictionary<string,ICollection<int>>
ByCountry { get; }
}
13. WWW.HIGHWHEELSOFTWARE.COM 13
Indeksy - CLUSTERED
CREATE TABLE Customers (
nr int not null,
name nvarchar(50),
country nvarchar(50)
);
CREATE CLUSTERED INDEX Data
ON Customers (name);
public class Customer {
public int nr;
public string name;
public string country;
}
public interface CustomersTable {
IDictionary<string, ICollection<Customer>>
Data { get; }
}
14. WWW.HIGHWHEELSOFTWARE.COM 14
Indeksy – CLUSTERED + NONCLUSTERED
CREATE TABLE Customers (
nr int not null,
name nvarchar(50),
country nvarchar(50)
);
CREATE CLUSTERED INDEX Data
ON Customers (name);
CREATE NONCLUSTERED
INDEX ByCountry
ON Customers (Country);
public class Customer {
public int nr;
public string name;
public string country;
}
public interface CustomersTable {
IDictionary<string, ICollection<Customer>>
Data { get; }
IDictionary<string, ICollection<string>>
ByCountry { get; }
}
* W zasadzie Tuple<string,RowId> chyba że
UNIQUE(name)
15. WWW.HIGHWHEELSOFTWARE.COM 15
Indeksy – PRIMARY KEY
CREATE TABLE Customer (
nr int not null IDENTITY(1,1) PRIMARY KEY,
name nvarchar(50),
country nvarchar(50)
);
Niejawna deklaracja CLUSTERED INDEX (nr)
PRIMARY KEY NONCLUSTERED
niejawne: NONCLUSTERED INDEX (nr)
16. WWW.HIGHWHEELSOFTWARE.COM 16
Sterta vs B-Drzewo - dogrywka
• CLUSTERED INDEX
• Wszystkie inne indeksy odwołują się do klucza tego indeksu
• min. 1 odczyt więcej
• Przenoszenie rekordu – bez zmiany indeksów nieklastrowanych
• Sterta
• Indeksy odwołują się do położenia rekordu
• odczyt od razu danych
• Przenoszenie rekordu – zmiana w indeksach
19. WWW.HIGHWHEELSOFTWARE.COM 19
Partycje cechy
• Dane fizycznie w wielu tabelach o tej samej strukturze,
logicznie połączone w jedną kolekcję
• Partition1.Concat(Partition2).Concat(Partition3)…
• Partycje można niezależnie:
• Podmienić / dodać / usunąć
• Umieszczać w różnych plikach (wydajność/koszt/backup)
• Kompresować
• Utrzymywać (działania administracyjne)
• Każdy obiekt można partycjonować inaczej