DB Maint plan
Download
Report
Transcript DB Maint plan
CAPITOLE AVANSATE
DE BAZE DE DATE
SQL-Server.
Performanta 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
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 function fn_part_an ()
split range (2006)
go
alter partition scheme sch_part_an
next used fg2006
go
Goala, dar
marcata ca
“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);
0 = no autogrowth
Verifica fragmentarea datelor disc (defrag Win)
Observatie: Pentru o buna performanta, fisierul de loguri trebuie stocat
pe un suport performant!!!
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
XEvents
Plan de executie
Hints
Duration
Reads
Writes
CPU
...
Locking / isolation level hints
Index hints
Join hints
Indecsi
Performanta interogari
DMV’s (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 logului 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 & log +
recuperare full
Backup full & diferential & 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
Restaurare BD din ultimul backup full, 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 DATABASE database FROM full_database_backup WITH
NORECOVERY
Daca exista backup-uri diferentiale, restaurare din ultimul, fara recuperare
BACKUP LOG database TO DISK = ‘…\DB.bak' WITH NORECOVERY
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
Atentie:
• ALTER TABLE … WITH NOCHECK ADD CONSTRAINT … + ALTER TABLE
… CHECK CONSTRAINT …,
• ALTER TABLE … NOCHECK | CHECK CONSTRAINT …
• => ALTER TABLE … WITH CHECK CHECK CONSTRAINT …
Jobs / Maintenance plans
SQL-Server Agent – scheduling agent
Jobs
Nume, context BD (BD’s), 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
...