Sunteți pe pagina 1din 29

CAPITOLE AVANSATE

DE BAZE DE DATE
SQL-Server.
Performante si intretinere.
Maintenance Plan
Maintenance plan / SQL-Server
Performante bune:
Design (tabele + indecsi)
Statistici
Partitionare
Gestiune fisiere server

Plus monitorizare si intretinere:
Indicatori de performanta (Windows / SQL-Server)
Performanta interogarilor
Defragmentare indecsi
Actualizare statistici
Creare backup + verificare backup
Intretinere fisiere log-uri
Verificare BD (CHECK DB)
Design
Design:

Normalizare
Alegerea tipurilor de date corespunzatoare
Definire chei primare, chei straine
Definire unique constraints, check constraints
Folosire de view-uri (posibil indexate) pentru
denormalizare
Partitionare tabele
Design. Indecsi
+ Creare de indecsi necesari in operatiile pe tabele

Index clustered pe o cheie cat mai mica
Cate un index pentru fiecare cheie straina (join)
Creare de indecsi covering pentru interogari (WHERE,
GROUP BY, ORDER BY, DISTINCT)
Creare de indecsi compusi a.i. prima (primele) coloana(e)
sa fie cea mai selectiva(e) (cele mai multe valori distincte)

Indecsi + included columns (no lookups)
FILL FACTOR
Design

Observatie: view-uri indexate:

CREATE VIEW + CREATE UNIQUE CLUSTERED INDEX
Ocupa spatiu fizic
Orice modificare pe tabelele sursa ale view-ului (care influenteaza
si continutul view-ului) produce si modificarea view-ului (index-
ului)
Optimizare interogari
Statistici
Query Optimizer foloseste statistici pentru datele din tabele sau view-uri
indexate pentru a alege un plan de executie cat mai bun (SELECT, INSERT,
UPDATE, DELETE)
Arata distributia valorilor pe una sau mai multe coloane (cate valori distincte
sunt, cu ce frecventa se repeta) pe intervale de valori
Folosite pentru a estima numarul de inregistrari din rezultat
Statistici create si actualizate automat sau manual

DBCC SHOW_STATISTICS
histograma:
RANGE_HI_KEY (limita superioara interval),
RANGE_ROWS (cate inregistrari se incadreaza pe interval),
EQ_ROWS (cate inregistrari au valoarea egala cu limita superioara),
DISTINCT_RANGE_ROWS (cate inregistrari distincte sunt pe interval = valori distincte
pe coloana urmarita),
AVG_RANGE_ROWS ( = RANGE_ROWS / DISTINCT_RANGE_ROWS)
CREATE STATISTICS
UPDATE STATISTICS / EXEC sp_updatestats (all tables)

Partitionare orizontala
SQL Server 2005 ->

Pas 1: Creare functie de partitionare
Exemplu

if exists ( select * from sys.partition_functions
where name = 'fn_part_an')
drop partition function fn_part_an
go
create partition function fn_part_an ( int )
as range right
for values ( 2000, 2002, 2004 )
--[min int, 2000), [2000, 2002), [2002, 2004), [2004, max int)
go

Partitionare orizontala
Pas 2: Creare schema de partitionare
Exemplu: toate partitiile in acelasi (grup de fisiere) fisier

CREATE PARTITION SCHEME sch_part_an
AS PARTITION fn_part_an ALL TO ([PRIMARY])
Partitionare orizontala
Pas 2: Creare schema de partitionare
Exemplu: partitii in grupuri de fisiere diferite

if exists ( select * from sys.partition_schemes
where name = 'sch_part_an')
drop partition scheme sch_part_an
go
create partition scheme sch_part_an
as partition fn_part_an
to (fg0, fg2000, fg2002, fg2004, fg2006)
go

alter partition scheme sch_part_an
next used fg2008
go
alter partition function fn_part_an ()
split range (2006)
go
next used
Partitionare orizontala
Pas 3: Creare tabel + partitii
Exemplu

CREATE TABLE Contracte
(ContractID int NOT NULL,
AngajatId int NOT NULL,
AngajatorId int NOT NULL,
DataIncheiere datetime NOT NULL,
An int NOT NULL
CONSTRAINT CK_An CHECK (An >= 1999 AND An <= 2006))
ON sch_part_an (An)
GO
select partitie = $PARTITION.fn_part_an(an), nr_inreg = count(*)
from dbo.contracte
group by $PARTITION.fn_part_an(an)
order by partitie;
Gestiune fisiere server
Gestiune fisiere server:
Pozitionare fisiere de date pe alt disc fata de fisierele de log-uri
Pozitionare tempDB pe alt disc fata de fisierele de date si fisierele de
log-uri
Pozitionare fisiere backup pe alt disc (alta masina) fata de alte fisiere
ale server-ului
Monitorizare dimensiune fisiere (vezi autogrow)
ALTER DATABASE myDB
MODIFY FILE (NAME = myDBFileName, SIZE = 20MB, FILEGROWTH = 10MB);
Verifica fragmentarea datelor disc (defrag Win)

Observatie: Pentru o buna performanta, fisierul de loguri trebuie stocat
pe un suport performant!!!
0 = no autogrowth
Indicatori de performanta (Windows
/ SQL-Server)

Windows
Computer management -> System Tools -> Performance Logs
and Alerts (or perfmon.exe)

SQL-Server
Tools -> Performance -> SQL Server Profiler (sau folosind sp-
uri)
sys.dm_os_performance_counters => object_name,
counter_name, cntr_value, ... (locks, transactions, access
methods, errors, statistics, cursor manager, memory manager,
deprecated features, ...)
Indicatori de performanta (Win)

Performanta interogari
SQL Profiler
Duration
Reads
Writes
CPU
...

XEvents

Plan de executie

Hints
Locking / isolation level hints
Index hints
Join hints

Indecsi
Performanta interogari
DMVs (2005 ->)
last_execution_time, execution_count
min, max, last, total: worker_time, logical_reads,
logical_writes, elapsed_time
query text, query hash

SELECT *
FROM sys.dm_exec_query_stats AS qstats
CROSS APPLY sys.dm_exec_sql_text(qstats.sql_handle) AS qtext
Performanta interogari
XEvents (2008 ->)
solicita putine resurse
gestiune: interfata grafica sau Transact-SQL
colectare de informatii
pachete
events
targets events consumers / event output
file
ring buffer
...
actions
predicates
Performanta interogari
XEvents (2008) exemplu:

CREATE EVENT SESSION XESession_FindLongRunningQueries ON SERVER

ADD EVENT sqlserver.sql_statement_completed
(
ACTION (sqlserver.sql_text, sqlserver.tsql_stack)
WHERE sqlserver.sql_statement_completed.duration > 1000
)

ADD TARGET package0.asynchronous_file_target(
SET filename = 'c:\Temp\XE_FindLongRunningQueries.xet',
metadatafile = 'c:\Temp\XE_FindLongRunningQueries.xem')
--------------------------------------------
ALTER EVENT SESSION LongRunningQuery ON SERVER STATE = START

ALTER EVENT SESSION LongRunningQuery ON SERVER STATE = STOP

(DMV: sys.fn_xe_file_target_read_file => citeste async. file target / XML / one
row per event)

DROP EVENT SESSION LongRunningQuery ON SERVER
Defragmentare indecsi
Tabele si indecsi colectii de extends = 8 pagini; 1 pagina = 8KB

Index clustered:
B+-arbore;
in nodurile interioare exista intrari care contin valori cheie (plus adrese ale
nodurilor fiu);
in nodurile terminale sunt stocate inregistrarile din tabelul indexat

Index non-clustered:
B+-arbore;
peste un tabel indexat clustered sau heap (neindexat)
in nodurile interioare exista intrari care contin valori cheie (plus adrese ale
nodurilor fiu);
In nodurile terminale valoare cheie + row locator:
daca e heap row locator refera inregistrare din tabel
daca e tabel indexat clustered row locator este cheia indexului clustered (pp
unique)

Defragmentare indecsi

Fragmentare cand ordinea logica a paginilor nu corespunde cu
ordinea fizica a paginilor in fisier fragmentare externa (fizica)
Plus mult spatiu liber in paginile unui index fragmentare interna
(logica)

Determinare nivel de fragmentare: sys.dm_db_index_physical_stats
(avg_fragmentation_in_percent, avg_page_space_used_in_percent)

=> Reorganizare sau Reconstruire (ALTER INDEX)
Frag intre 10% si 30% => REORGANIZE
Frag > 30% => REBUILD
(posibil si alte valori)

Fill factor (in caz de REBUILD)
Backup
Recovery models:
Simple
No log backup
Mai putin spatiu necesar
Nu se pot recupera modificarile efectuate de la ultimul backup
Full
Log backups
Mai mult spatiu necesar
Se pot recupera modificari de la ultimul backup de log (posibil chiar coada log-ului
pana la momentul la care a aparut un defect daca dupa revenire se poate crea
backup pt tail-log)
Bulk-logged
Log backups
Performanta mai mare pentru operatii bulk copy decat full (min logging)
Se pot recupera modificari pana la ultimul backup (mai departe, depinde de starea log-
ului si daca au avut loc operatii bulk)

Importanta ca ultimele operatii sa nu se piarda vs. costul backup-ului si restaurarii
Backup

Backup:

Full (BACKUP DATABASE)
Intreaga baza de date

Diferential (BACKUP DATABASE WITH DIFFERENTIAL)
De la ultimul backup full

(plus file / filegroup / page backup)

Log (BACKUP LOG)

Backup + simple recovery
Backup full +
recuperare simpla
Backup full & diferential +
recuperare simpla
Backup + full recovery
Backup full & diferential & log +
recuperare full
Backup full & log +
recuperare full
Restaurare si recuperare

Restaurare BD copiere de date din backup in BD

Recuperare BD eventual refacerea operatiilor tranzactiilor
inregistrate in log-uri + anularea tranzactiilor ne-comise, dupa
crearea ultimului backup folosit; BD devine online (RESTORE
DATABASE WITH RECOVERY)

Restaurare si recuperare
Creare backup pentru tail-log portiunea din transaction log activa
BACKUP LOG database TO DISK = \DB.bak' WITH NORECOVERY
Restaurare BD din ultimul backup full, fara recuperare
RESTORE DATABASE database FROM full_database_backup WITH
NORECOVERY
Daca exista backup-uri diferentiale, restaurare din ultimul, fara recuperare
RESTORE DATABASE database FROM full_differential_backup WITH
NORECOVERY
Pentru fiecare backup de log care a fost creat de la ultimul backup folosit,
restaurare log-uri pe rand, fara recuperare (ultimul este tail-log backup)
RESTORE LOG database FROM log_backup WITH NORECOVERY
Recuperare BD
RESTORE DATABASE database_name WITH RECOVERY

Log

Fisier log = n fisiere virtuale

Fisier circular

Micsorarea fisierului de log-uri
vezi DBCC SHRINKFILE
BACKUP LOG

Stare BD
Monitorizare integritate BD
DBCC CHECKDB ( = DBCC CHECKALLOC + DBCC CHECKTABLE +
DBCC CHECKCATALOG + alte validari)
Consistenta structurilor de alocare a spatiului pe disc
Integritatea paginilor si structurilor unui tabel sau view indexat
Consistenta catalogului
Monitorizare integritate date
DBCC CHECKCONSTRAINTS
Consistenta datelor conform constrangerilor existente
(vezi ALTER TABLE WITH NOCHECK ADD CONSTRAINT )

Jobs / Maintenance plans
SQL-Server Agent scheduling agent
Jobs
Nume, context BD (BDs), owner
Steps (next job, success, failure); transact-SQL, extern exe, si altele
(Opt) Schedule
(Opt) Output
(Opt) Notifications la terminarea executiei job-ului (email, pager, net
send, si altele)
Maintenance plan (user-friendly interface / wizard; usual jobs; limited
functionality)

Alte monitorizari
Profiler
Operatiile costisitoare (timp, CPU, read, write)
Planurile de executie; table scans & index scans
Tranzactiile lungi
Deadlock-urile
Replay traces
...
Spatiu liber / ocupat pe disc(uri) (vezi xp_fixeddrives)
Marirea fisierelor daca nu sunt setate sa-si mareasca dimensiunea
automat
Alte view-uri sistem
sys.dm_db_missing_index_details
sys.dm_db_index_physical_stats
...