View
216
Download
3
Embed Size (px)
#JSS2013
Les journes
SQL Server 2013
Un vnement organis par GUSS
#JSS2013
Les journes
SQL Server 2013
Un vnement organis par GUSS
Les VerrousArian Papillon, MVP SQL Server
Frdric Brouard, MVP SQL Server
#JSS2013
Arian Papillon a.papillon@datafly.fr
Frdric Brouard sqlpro@sqlspot.com
#JSS2013
Bientt dans les bacs
#JSS2013
Merci nos sponsors
#JSS2013
SGBD et concurrence daccs
Quest-ce quun verrou ?
Transactions et niveaux disolation
Ltreinte fatale ou verrou de la mort
Diagnostiquer les verrous, attentes, blocages
Limiter la contention et les deadlocks
Agenda
#JSS2013
Plusieurs utilisateurs accdent aux donnes et les
mettent jour
Il est ncessaire de garantir la stabilit des donnes
afin que des accs simultans aux mmes donnes
ninterfrent pas
Le verrou est le mcanisme de base pour assurer la
stabilit des donnes
SGBD : Systme Multi-Utilisateurs
#JSS2013
Pessimiste : blocage priori
Les lectures bloquent les critures
Les critures bloquent tout
Mode par dfaut dans SQL Server
Optimiste : vrification postriori
Bas sur un versionning des lignes
Aussi pris en charge par SQL Server
Comment grer les accs concurrents ?
#JSS2013
ANOMALIES TRANSACTIONNELLES :
Le dernier qui met jour gagne : les mises jour prcdentes sont crases (perte de mise jour)
Lors des lectures, si une mise jour est en cours, il peut y avoir : lectures sales , lectures non rptables, lignes fantmes
Le temps de lire toutes les lignes dune table, un autre utilisateur peut changer les valeurs de certaines lignes. Exemple : deux produits identiques mis successivement dans un
mme panier, pourraient avoir deux prix diffrents !
Sans verrouillage, que se passe-t-il ?
#JSS2013
Le mcanisme utilis pour contrler laccs
une mme donne par de multiples
utilisateurs
Avant quune transaction neffectue une
modification, elle doit sassurer un accs
exclusif la donne
Quest-ce quun verrou ?
#JSS2013
Ressources verrouillables et granularit
Base de donnes
Table
Partition
Page
Ligne
Cl (index)
Range de cls
Schma
Extension
Fichier
Mode de verrouillage X : exclusif S : partag U : update I : intention (IS, IX) SIX/SIU/UIX : partags avec
intention
Dure :
Lecture
Ordre SQL
Transaction
Quest-ce quun verrou
#JSS2013
Compatibilit des modes de verrouillage
IS S U IX SIX X
IS
S
U
IX
SIX
X
Verrou poser
Verrou existant
#JSS2013
Lorsquune ressource est verrouille et quune
autre transaction ncessite la pose dun verrou
en conflit sur cette mme ressource : attente.
Par dfaut, lattente est infinie
SET LOCK_TIMEOUT configur pour la session permet
labandon (et lerreur 1222)
Blocages et attentes
#JSS2013
Le verrou est une ressource serveur conomiser
Cote environ 100 octets
SQL Server choisit la granularit de verrouillage adapte la
requte excuter (ligne, page, partition ou table)
Pendant le traitement, de nombreux verrous sont acquis.
Au fil de lexcution, limitation de la charge par escalade (ligne
ou page > table) :
Conversion des verrous dintention
Lorsquil atteint environ 5000 locks pour une instruction, en cas dchec
tentative tous les 1250 locks (valeurs approximatives)
Escalade de verrous
#JSS2013
Dmo
#JSS2013
On peut contrler la concurrence daccs, par :
Une transaction explicite
Le niveau disolation des transactions
Mcanismes logiques
#JSS2013
Concerne toute opration unitaire de lecture ou criture (implicite)
Lorsque plusieurs tables sont concernes, les oprations doivent
seffectuer en tout ou rien (compltement ou pas du tout
transaction explicite).
Implicite : Toute commande SQL (DDL, DML, DCL) est une transaction
Commit automatique par dfaut (SET IMPLICIT_TRANSACTIONS)
ou explicite : Dmarrage par BEGIN TRANSACTION
Finalisation par COMMIT ou ROLLBACK
Transaction
#JSS2013
Lectures impropres (sales, dirty, chaos)
Lecture non rptables
Lecture fantme
Les anomalies transactionnelles potentielles
#JSS2013
Sans contrle READ UNCOMMITTED
Pessimiste READ COMMITTED
REPEATABLE READ
SERIALIZABLE
Optimiste READ COMMITTED SNAPSHOT
SNAPSHOT
Les niveaux disolation
#JSS2013
Au niveau session :
SET TRANSACTION ISOLATION LEVEL
Au niveau table / ordre SQL :
Hints de table NOLOCK | READUNCOMMITTED
READCOMMITTED
REPEATABLEREAD
HOLDLOCK | SERIALIZABLE
UPDATE Production.Product WITH (SERIALIZABLE)
Grer son niveau disolation
#JSS2013
Dmo
#JSS2013
Interblocage de ressources :
Concerne au moins 2 transactions simultanes
Survient si au moins une transaction concerne deux ressources
Lune des transactions doit crire
Dead lock : ltreinte fatale
#JSS2013
Comportement :
Chaque transaction attend la libration des
ressources dtenues par lautre
Dtect par le moniteur de verrouillage
Annule automatiquement la moins coteuse
SET DEADLOCK_PRIORITY
Dead lock : ltreinte fatale
#JSS2013
Dmo
#JSS2013
Wait Stats : statistiques dattente depuis le dmarrage DMV sys.dm_os_wait_stats
Attentes de verrous > 30 secondes XEvents : SystemHealth
Activit globale de verrouillage Analyseur de performances (perfmon)
Compteurs Lock Requests/s, Lock Waits/s, Lock Wait Time (ms), Number of Deadlocks/s
Activit en cours sp_lock, sp_who, moniteur dactivit
DMV sys.dm_tran_locks
Captures dtailles des verrous poss et escalades Profiler
Sessions XEvents
Dtecter les attentes de verrous
#JSS2013
Capturer les informations sur les verrous bloquants :
Block Process Report
Configurer le seuil de dclenchement dans les
proprits de linstance
Recueil des informations avec : profiler
notification dvnement
XEvents
Dtecter les blocages
#JSS2013
Trace Flags 1204 et 1222
Capturer les informations sur les Deadlocks Deadlock Graph
Capture avec : profiler
notification dvnement
Xevents : vnement prsent dans System Health
Dtecter les deadlocks
#JSS2013
Dmo
#JSS2013
Hints de table PAGLOCK | ROWLOCK | TABLOCK (et UPDLOCK | XLOCK | TABLOCKX)
Options dindex ALLOW_ROW_LOCKS
ALLOW_PAGE_LOCKS
ALTER TABLE SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Laisser un lock IX positionn sur une tableBEGIN TRANSELECT * FROM TABLE1 WITH (UPDLOCK,SERIALIZABLE) WHERE 1=0WAITFOR DELAY ... COMMIT
TraceFlags (global ou session) utiliser avec prcaution 1224 : dsactive jusqu 40% mmoire utilise, puis ractive
1211 : dsactive totalement lescalade jusqu saturation mmoire et erreur
Contrler la granularit ou lescalade
#JSS2013
Pour limiter la contention et viter les blocages
Faire des transactions les plus courtes possible :
viter de sur transactionner
Minimiser le code transactionn
Faire les transactions ct serveur (procdures stockes)
Noubliez pas que certains verrous ne sont levs quen
finalisation (COMMIT, ROLLBACK)
Bonnes pratiques
#JSS2013
Pour limiter la contention et viter les blocages
Normalisation :
Tables obses vs tables fines
Plus une table est grosse , plus elle concentre de mise jour
Corrler avec : sys.dm_db_index_usage_stats /
SUM(user_updates)
Remodliser, partitionner (vertical, horizontal).
Bonnes pratiques
#JSS2013
Pour limiter la contention et viter les blocages
Indexation, optimisation
Plans de requte : viter les parcours de table ou dindex
grce une indexation efficace
Les index servent aussi pour les mises jour !
Rcrire les requtes pour diminuer le temps de traitement
Bonnes pratiques
#JSS2013
Pour limiter la contention et viter les blocages
criture du code :
viter le code non ensembliste :
Boucle
Curseur
Variable table, table temporaires, fonctions table
Faire les transactions explicites ct serveur !
Bonnes pratiques
#JSS2013
Pour limiter la contention et viter les blocages
Diminuer la force du verrouillage
Descendre le niveau disolation global
Adapter pour certaines tables
Utiliser lUPDATE pour lecture
Bonnes pratiques
#JSS2013
Pour limiter le verrou mortel
criture du code :
Placer les mises jour avant les lectures
Squencer les oprations dans le mme ordre logique
dobjets
Bonnes pratiques
#JSS2013
Blog Datafly :
http://blog.datafly.pro/post/les-verrous
Blog SQLPro :
http://blog.developpez.com/sqlpro/p/ms-sql-
server/les-verrous
Site GUSS : www.guss.pro
Tlchargez la prsentation
http://blog.datafly.pro/post/les-verroushttp://blog.d