SlideShare une entreprise Scribd logo
1  sur  27
http://GUSS.Pro @GUSS_FRANCE
La communauté Data Microsoft
Sarah Bessard – Concat Skills - Consultante indépendante
Nicolas Souquet – Ivalua – DBA Senior
De la requête aux disques
en passant par la RAM
http://GUSS.Pro @GUSS_FRANCE
Rejoignez la communauté Data
Webcasts, Conférences, Afterworks
La communauté
Data Microsoft
@GUSS_FRANCE /GUSS /GUSS.FR
http://GUSS.Pro @GUSS_FRANCE
@concatskills contact@concatskillscom
Sarah BESSARD – Consultante sénior
http://GUSS.Pro @GUSS_FRANCE
Hardware I/O
Système de stockage DAS, SAN, NAS
Type de disque SCSI, SATA, SAS, SSD…
Vitesse Nombre de tours (mécanique)
Jusqu’à 15 000 tr/min
RAID RAID5
RAID6
RAID10
Cache sur le RAID Ecriture
http://GUSS.Pro @GUSS_FRANCE
Mesures I/O
Capacité Go, To
Latence Avg Disk sec/Read
Avg Disk sec/Write
IOPS par sec Disk Reads/sec
Disk Writes/sec
Débit Mo/Go Disk Read Bytes/sec
Disk Write Bytes/sec
http://GUSS.Pro @GUSS_FRANCE
Moniteur de performance
http://GUSS.Pro @GUSS_FRANCE
Moniteur de ressource
http://GUSS.Pro @GUSS_FRANCE
Outils de benchmark
• SQL Server
• SQLIOSim : Simuler l’activité de SQL Server (lectures, écritures, checkpoint, sauvegarde, tris et lectures
anticipées)
• Livré avec SQL Server 2008 et suivants
• C:Program FilesMicrosoft SQL ServerMSSQL1X.SQL20XXMSSQLBinn
• DiskSpd : nécessite l’apprentissage des paramètres, mais encore plus souple que SQLIOSim
• Latences, Avg. Disk Read/Write, …
• CrystalDiskMark : permet de tester simplement et rapidement un volume de stockage
• Tests TPC (www.tpc.org)
• Résultats de tests de charge sur des configurations de stockage
http://GUSS.Pro @GUSS_FRANCE
Fichiers de bases de données
Une base de données est constituée d’au moins deux types de fichiers
• DATA (mdf, ndf) : données, index
• Type : Aléatoire
• Accès : Lecture/Ecriture
• Mode : Asynchrone
• LOG (ldf): journal de transactions
• Type : Séquentiel
• Accès : Ecriture, [Lecture]
• Mode : Synchrone MDF LDFNDF
http://GUSS.Pro @GUSS_FRANCE
DATA : Processus de lecture
Les données présentes sur disque sont transférées en mémoire pour être lues… Et modifiées au besoin.
Application
SELECT
Disque (MDF, NDF)
Page
Buffer Cache
Page
Application
Ligne
Lecture physique Lecture logique
Opérateurs logiques & physiques :
Table Scan, Index Seek, Index Scan
http://GUSS.Pro @GUSS_FRANCE
DATA & LOG : Processus d’écriture
• LOG : journal de transactions
• Log Writer : Logging
• Write-ahead log : ACID
• DATA (mdf, ndf) : données, index
• Checkpoint : Flush de dirty page automatique, indirect, manuel, interne
• Lazy Writer : Mémoire disponible et flush de dirty page
• Eager Writer : BULK INSERT, SELECT INTO
• Ghost cleanup : Suppression de pages
Application
INSERT
UPDATE
DELETE
Buffer Cache
Page
Disque (MDF, NDF)
Page
Ecriture physique
Log Cache
Page
Disque (LDF)
Page
WAL
Checkpoint
Lazy Writer
Eager Writer
Ghost Cleanup
Ecriture physique
(Commit Tran)
Ecriture logique
Log Writer
http://GUSS.Pro @GUSS_FRANCE
Types et accès I/O par opération
Opération Type Accès Taille de block
Log : Log Writer Séquentiel Ecriture Up to 60KB
Log : Log Reader Séquentiel Lecture Up to 120KB
Data : Checkpoint Aléatoire Ecriture Up to 256KB
Data : Lazy Writer Aléatoire Ecriture Up to 256KB
Data : Index Seeks Aléatoire Lecture 8KB
64KB (read Ahead)
Data : Table / Range Scan Séquentiel Lecture 64KB-512KB
Data : Bulk Insert Séquentiel Ecriture 64KB-256KB
Data & Log : Backup
Operations
Séquentiel Ecriture 64KB-4MB
http://GUSS.Pro @GUSS_FRANCE
Structure d’un enregistrement (1/4)
• Tous les enregistrements d’une table ou d’un index qui sont de même type ont la même structure physique
• Quel que soit le nombre de colonnes qu’ils comptent
• Types :
• données « utilisateur » : principalement tables et index (format : FixedVar)
• bitmaps d’allocation
• Stockage spécifique : LOBs, compression (format : CD), FileStream, ColumnStore
TagA TagB Fsize FData Ncol NullBits VarCount VarOffset VarData
Versioning
tag
http://GUSS.Pro @GUSS_FRANCE
TagA :
• 1 octet
• Bit 0 : plus utilisé dès SQL Server 2008 (version du type d’enregistrement, toujours à zéro)
• Bits 1 à 3 : type d’enregistrement
• 0 : enregistrement primaire
• 1 : enregistrement transféré
• 2: enregistrement transférant
• 3 : enregistrement d’index
• 4 : sous-chaîne (au sens binaire) de LOB
• 5 : enregistrement d’index fantôme*
• 6 : enregistrement de données fantôme*
• 7 : enregistrement versionné** fantôme*
• Bit 4 : l’enregistrement à une bitmap de NULL
• Bit 5 : l’enregistrement a des valeurs de longueur variable
• Bit 6 : l’enregistrement est versionné**
• Bit 7 : plus utilisé dès SQL Server 2008
* cf. processus système GHOSTCLEANUP
** cf. support des niveaux d’isolation de transaction snapshot
Structure d’un enregistrement (2/4)
http://GUSS.Pro @GUSS_FRANCE
TagB : 1 octet. Obsolète dès SQL Server 2008
Fsize : 2 octets. Taille cumulée des colonnes de types de longueur fixe
FData : Données dont le type est de longueur fixe
NCol : 2 octets. Nombre de colonnes
Structure d’un enregistrement (3/4)
http://GUSS.Pro @GUSS_FRANCE
VarCount : 2 octets. nombre de colonnes de longueur variable
VarOffset : (2 * VarCount) octets
NullBits : tableau des bitmap de NULL
• 1 bit pour chaque colonne de la table, qu’elle soit NULLable ou non
• 1 octet jusqu’à 8 colonnes, 2 octets entre 9 et 16 colonnes, etc …
• Intérêt :
• Il n’est plus nécessaire de stocker des valeurs spéciales pour signifier le NULL
• Si on n’a pas cette bitmap, il est difficile d’indiquer qu’une colonne est à NULL
• Pour les colonnes de type (n)varchar, c’est ce qui permet de différencier un NULL d’une chaîne de longueur nulle
• Cela minimise les cycles CPU : sans elle :
• Pour les valeurs dont le type est fixe, il faut lire la valeur de la colonne, et la comparer la « valeur » NULL du
type de données de la colonne
• Pour les valeurs à longueur variable, je vous laisse imaginer 
• Absente au niveau feuille des index non-cluster, et à la racine et dans les niveaux intermédiaires des index cluster et
non-cluster si l’ensemble des colonnes clé de l’index ne sont pas NULLable
Structure d’un enregistrement (4/4)
http://GUSS.Pro @GUSS_FRANCE
Structure d’une page
Espace libre
En-tête : 96 octets
011001110011100111 1111001
0110011100111 011001110
011001110011100011001101
Tableau des offset des lignes
011001110011100011001101 1111
01100100011001101 01010101111
0011101101011010101001
8192 octets8096 octets
• Les enregistrements ne sont pas toujours
stockés dans l’ordre logique : c’est le
tableau des offsets qui l’indique
• L’espace libre n’est pas toujours contigu
• Le tableau des offsets indique la position
de chaque ligne dans la page par des
entiers de 2 octets
http://GUSS.Pro @GUSS_FRANCE
Structure d’une étendue
• Groupe de 8 pages physiquement consécutives
• Taille : 64Ko
• C’est la plus petite unité de travail du moteur de stockage
• D’où l’intérêt de tailler les clusters des disques supportant les fichiers de la base à 64Ko
• Toujours alignées sur le ”début“ du fichier
• Deux types
• Partagée
• Pour les objets avec une faible quantité de données
• Jusqu’à SQL Server 2016 RTM inclus, dans TempDB, si le drapeau de trace 1118 n’est pas activé
• Jusqu’à 8 objets
• Uniforme
• Dédiées à un seul objet (table ou index)
http://GUSS.Pro @GUSS_FRANCE
Type Signification
N° de
première
page
Intervalle entre
les pages de ce
type
But Stockage adressé
Nombre de pages
adressées
File Header 0 - En-tête du fichier Fichier -
PFS Page Free Space 1 8088 Trace l’espace libre
Page
(byte-map)
8088 pages
= 64Mo
GAM
Global
Allocation Map
2 511230
Trace l’allocation des étendues
uniformes
Etendue
(bitmap)
8000 octets
= 640000
étendues
= 4Go
SGAM
Shared Global
Allocation Map
3 511230
Trace l’allocation des étendues
partagées
DCM
Differential
Changes Map
6 511230
Trace les étendues qui ont été
écrites depuis la dernière
sauvegarde complète
BCM
Bulk Changes
Map
7 511230
Trace les étendues qui ont été
écrites depuis la dernière
sauvegarde du fichier du
journal des transactions
IAM
Index Allocation
Map
- 512000
Trace les étendues dédiées à
une unité d’allocation d’un
objet particulier
http://GUSS.Pro @GUSS_FRANCE
Page Free Space : détails
• Bit 1 : indique si la page est allouée ou non
• Les GAM et SGAM indique si l’étendue est allouée, mais pas quelles pages dans l’étendue le sont ou non
• Bit 2 : Indique si la page provient d’une étendue partagée ou uniforme
• Bit 3 : indique si la page est une IAM (les IAM n’ont pas d’emplacement spécifique dans les fichiers de données)
• Bit 4 : indique si la page contient des enregistrements fantômes
• Bits 5 à 7 : codage sur 3 bits de valeurs de zéro à 4, indiquant le taux de remplissage de la page
• 0 : la page est vide
• 1 : la page est occupée entre 1 et 50%
• 2 : la page est occupée entre 51 et 80%
• 3 : la page est occupée entre 81 et 95%
• 4 : la page est occupée entre 96 et 100%
http://GUSS.Pro @GUSS_FRANCE
Index Allocation Map : détails
Table
IN_ROW ROW_OVERFLOW LOB
IAM
IN_ROW
IAM
ROW_OVERFLOW
IAM
LOB
IAM
IN_ROW
IAM
ROW_OVERFLOW
IAM
LOB
4Go
4Go
sys.tables
sys.allocation_units
Partition sys.partitions
http://GUSS.Pro @GUSS_FRANCE
 Croissance de fichier
 Groupe de fichiers
 Partitionnement
 Traceflag 1117 : Croissance uniforme
 Instant File Initialization
 Log non inclus
 Tempdb
 Compression : table, index
 Index Columstore
 Vues indexées
 In-Memory
 DATA en mémoire
DATA : Optimisations
http://GUSS.Pro @GUSS_FRANCE
DEMO
Réduction des I/O
http://GUSS.Pro @GUSS_FRANCE
 Croissance de fichier
 MB
 Virtual Log Files (VLF)
 Règle d’allocation de l’incrément : voir ici
 Délai de durabilité
Ecriture asynchrone dans les logs
Commit de la transaction avant écriture sur disque
 Recovery Interval : Checkpoint (indirect)
 In-Memory
 Logging limité
 Durabilité : SCHEMA_ONLY
 Affinité CPU pour les I/O : Traceflag 8002
 Stockage Tempdb : Disque SSD, local (VS SAN), RAID10 dédié
LOG : Optimisations
http://GUSS.Pro @GUSS_FRANCE
Mesures SQL Server
DMV Mesure Granularité
sys.dm_io_virtual_file_stats Latence, IOPS Fichier de base de données
sys.dm_exec_query_stats IOPS Requête
sys.dm_db_index_usage_stats
IOPS et opérations (seek, scan,
lookup…)
Index, Table
sys.dm_os_wait_stats Attentes Instance
sys.dm_exec_session_wait_stats Attentes Session
Xevents Attentes Requête
http://GUSS.Pro @GUSS_FRANCE
PAGEIOLATCH_* : Transfert disque vers RAM, data page I/O
PAGELATCH_* : Sérialisation de l’accès des pages en RAM
IO_COMPLETION : Tâches I/O en fin de traitement sur disque, non-
data page I/Os
WRITELOG : Attente sur fichier de log
Log Flush : checkpoint, commit
ASYNC_NETWORK_IO : Attente réseau consommation du résultat
Curseur
Latence réseau
Tuning : Requêtes I/O, Index, stockage, driver d’accès aux données
Mesures SQL Server
http://GUSS.Pro @GUSS_FRANCE
.Pro
Rejoignez la communauté Data Microsoft
Webcasts, Conférences, Afterworks
@GUSS_FRANCE
/GUSS
/GUSS.FR

Contenu connexe

Similaire à GUSS - Les IO dans SQL Server (en partenariat avec DataCore)

Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google CloudPierre Coste
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB MongoDB
 
introduction au SQL et MySQL
introduction au SQL et MySQLintroduction au SQL et MySQL
introduction au SQL et MySQLAbdoulaye Dieng
 
Quelles architectures matérielles pour Hadoop ?
Quelles architectures matérielles pour Hadoop ?Quelles architectures matérielles pour Hadoop ?
Quelles architectures matérielles pour Hadoop ?Modern Data Stack France
 
Petit-déjeuner MapReduce-La révolution dans l’analyse des BigData
Petit-déjeuner MapReduce-La révolution dans l’analyse des BigDataPetit-déjeuner MapReduce-La révolution dans l’analyse des BigData
Petit-déjeuner MapReduce-La révolution dans l’analyse des BigDataMarc Bojoly
 
Le PC en détail
Le PC en détailLe PC en détail
Le PC en détailBruno Delb
 
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...Patrick Guimonet
 
(Open)Solaris : Introduction aux zones et à ZFS
(Open)Solaris : Introduction aux zones et à ZFS(Open)Solaris : Introduction aux zones et à ZFS
(Open)Solaris : Introduction aux zones et à ZFSBruno Bonfils
 
Importer 500 millions de données de MySQL vers Neo4j
Importer 500 millions de données de MySQL vers Neo4jImporter 500 millions de données de MySQL vers Neo4j
Importer 500 millions de données de MySQL vers Neo4jGabriel Pillet 🐙
 
NetApp PartnersTour 2011 à Lille, mon point de vue
NetApp PartnersTour 2011 à Lille, mon point de vueNetApp PartnersTour 2011 à Lille, mon point de vue
NetApp PartnersTour 2011 à Lille, mon point de vueOlivier (DaffyDuke) Duquesne
 
03 big data échelle
03 big data échelle03 big data échelle
03 big data échellePatrick Bury
 
03 big data échelle
03 big data échelle03 big data échelle
03 big data échellePatrick Bury
 
Virtualiastion des systèmes d'exploitations
Virtualiastion des systèmes d'exploitationsVirtualiastion des systèmes d'exploitations
Virtualiastion des systèmes d'exploitationsSGHIOUAR abdelfettah
 
Architecture 4
Architecture 4Architecture 4
Architecture 4coursuniv
 

Similaire à GUSS - Les IO dans SQL Server (en partenariat avec DataCore) (20)

Exchange 2013 Bonnes pratiques
Exchange 2013 Bonnes pratiques Exchange 2013 Bonnes pratiques
Exchange 2013 Bonnes pratiques
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google Cloud
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB
 
introduction au SQL et MySQL
introduction au SQL et MySQLintroduction au SQL et MySQL
introduction au SQL et MySQL
 
Quelles architectures matérielles pour Hadoop ?
Quelles architectures matérielles pour Hadoop ?Quelles architectures matérielles pour Hadoop ?
Quelles architectures matérielles pour Hadoop ?
 
Chapitre 2
Chapitre 2Chapitre 2
Chapitre 2
 
Implementing a key/value store
Implementing a key/value storeImplementing a key/value store
Implementing a key/value store
 
Petit-déjeuner MapReduce-La révolution dans l’analyse des BigData
Petit-déjeuner MapReduce-La révolution dans l’analyse des BigDataPetit-déjeuner MapReduce-La révolution dans l’analyse des BigData
Petit-déjeuner MapReduce-La révolution dans l’analyse des BigData
 
Le PC en détail
Le PC en détailLe PC en détail
Le PC en détail
 
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
 
(Open)Solaris : Introduction aux zones et à ZFS
(Open)Solaris : Introduction aux zones et à ZFS(Open)Solaris : Introduction aux zones et à ZFS
(Open)Solaris : Introduction aux zones et à ZFS
 
Importer 500 millions de données de MySQL vers Neo4j
Importer 500 millions de données de MySQL vers Neo4jImporter 500 millions de données de MySQL vers Neo4j
Importer 500 millions de données de MySQL vers Neo4j
 
NetApp PartnersTour 2011 à Lille, mon point de vue
NetApp PartnersTour 2011 à Lille, mon point de vueNetApp PartnersTour 2011 à Lille, mon point de vue
NetApp PartnersTour 2011 à Lille, mon point de vue
 
03 big data échelle
03 big data échelle03 big data échelle
03 big data échelle
 
03 big data échelle
03 big data échelle03 big data échelle
03 big data échelle
 
Exchange Stockage : Mythes et Réalités
Exchange Stockage : Mythes et RéalitésExchange Stockage : Mythes et Réalités
Exchange Stockage : Mythes et Réalités
 
Assembleur
AssembleurAssembleur
Assembleur
 
Virtualiastion des systèmes d'exploitations
Virtualiastion des systèmes d'exploitationsVirtualiastion des systèmes d'exploitations
Virtualiastion des systèmes d'exploitations
 
Architecture 4
Architecture 4Architecture 4
Architecture 4
 
Le langage sql
Le langage sqlLe langage sql
Le langage sql
 

Plus de GUSS

JSS2015 - Machine Learning like a boss
JSS2015 - Machine Learning like a bossJSS2015 - Machine Learning like a boss
JSS2015 - Machine Learning like a bossGUSS
 
GUSS - CRITEO Meetup Scale SQL for the Web
GUSS - CRITEO Meetup Scale SQL for the WebGUSS - CRITEO Meetup Scale SQL for the Web
GUSS - CRITEO Meetup Scale SQL for the WebGUSS
 
JSS2015 - Keynote jour 2
JSS2015 - Keynote jour 2JSS2015 - Keynote jour 2
JSS2015 - Keynote jour 2GUSS
 
JSS2015 - Keynote jour 1
JSS2015 - Keynote jour 1JSS2015 - Keynote jour 1
JSS2015 - Keynote jour 1GUSS
 
[JSS2015] Azure SQL Data Warehouse - Azure Data Lake
[JSS2015] Azure SQL Data Warehouse - Azure Data Lake[JSS2015] Azure SQL Data Warehouse - Azure Data Lake
[JSS2015] Azure SQL Data Warehouse - Azure Data LakeGUSS
 
[JSS2015] Power BI Dev
[JSS2015] Power BI Dev[JSS2015] Power BI Dev
[JSS2015] Power BI DevGUSS
 
[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables
[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables
[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch TablesGUSS
 
[JSS2015] Query Store
[JSS2015] Query Store[JSS2015] Query Store
[JSS2015] Query StoreGUSS
 
[JSS2015] 3 DMV's pour evaluer les indexs
[JSS2015] 3 DMV's pour evaluer les indexs[JSS2015] 3 DMV's pour evaluer les indexs
[JSS2015] 3 DMV's pour evaluer les indexsGUSS
 
[JSS2015] Power BI: Nouveautés archi et hybrides
[JSS2015] Power BI: Nouveautés archi et hybrides[JSS2015] Power BI: Nouveautés archi et hybrides
[JSS2015] Power BI: Nouveautés archi et hybridesGUSS
 
[JSS2015] Infra bi#4 - le scale out
[JSS2015] Infra bi#4 - le scale out[JSS2015] Infra bi#4 - le scale out
[JSS2015] Infra bi#4 - le scale outGUSS
 
[JSS2015] In memory and operational analytics
[JSS2015] In memory and operational analytics[JSS2015] In memory and operational analytics
[JSS2015] In memory and operational analyticsGUSS
 
[JSS2015] Eradiction des deadlocks
[JSS2015] Eradiction des deadlocks[JSS2015] Eradiction des deadlocks
[JSS2015] Eradiction des deadlocksGUSS
 
[JSS2015] Architectures Lambda avec Azure Stream Analytics
[JSS2015] Architectures Lambda avec Azure Stream Analytics [JSS2015] Architectures Lambda avec Azure Stream Analytics
[JSS2015] Architectures Lambda avec Azure Stream Analytics GUSS
 
[JSS2015] - Azure automation
[JSS2015] - Azure automation[JSS2015] - Azure automation
[JSS2015] - Azure automationGUSS
 
[JSS2015] AlwaysOn 2016
[JSS2015] AlwaysOn 2016[JSS2015] AlwaysOn 2016
[JSS2015] AlwaysOn 2016GUSS
 
[JSS2015] - Document db et nosql
[JSS2015] - Document db et nosql[JSS2015] - Document db et nosql
[JSS2015] - Document db et nosqlGUSS
 
[JSS2015] x events
[JSS2015] x events[JSS2015] x events
[JSS2015] x eventsGUSS
 
[JSS2015] Nouveautés SSIS SSRS 2016
[JSS2015] Nouveautés SSIS SSRS 2016[JSS2015] Nouveautés SSIS SSRS 2016
[JSS2015] Nouveautés SSIS SSRS 2016GUSS
 
JSS2014 – Hive ou la convergence entre datawarehouse et Big Data
JSS2014 – Hive ou la convergence entre datawarehouse et Big DataJSS2014 – Hive ou la convergence entre datawarehouse et Big Data
JSS2014 – Hive ou la convergence entre datawarehouse et Big DataGUSS
 

Plus de GUSS (20)

JSS2015 - Machine Learning like a boss
JSS2015 - Machine Learning like a bossJSS2015 - Machine Learning like a boss
JSS2015 - Machine Learning like a boss
 
GUSS - CRITEO Meetup Scale SQL for the Web
GUSS - CRITEO Meetup Scale SQL for the WebGUSS - CRITEO Meetup Scale SQL for the Web
GUSS - CRITEO Meetup Scale SQL for the Web
 
JSS2015 - Keynote jour 2
JSS2015 - Keynote jour 2JSS2015 - Keynote jour 2
JSS2015 - Keynote jour 2
 
JSS2015 - Keynote jour 1
JSS2015 - Keynote jour 1JSS2015 - Keynote jour 1
JSS2015 - Keynote jour 1
 
[JSS2015] Azure SQL Data Warehouse - Azure Data Lake
[JSS2015] Azure SQL Data Warehouse - Azure Data Lake[JSS2015] Azure SQL Data Warehouse - Azure Data Lake
[JSS2015] Azure SQL Data Warehouse - Azure Data Lake
 
[JSS2015] Power BI Dev
[JSS2015] Power BI Dev[JSS2015] Power BI Dev
[JSS2015] Power BI Dev
 
[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables
[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables
[JSS2015] Nouveautés SQL Server 2016:Sécurité,Temporal & Stretch Tables
 
[JSS2015] Query Store
[JSS2015] Query Store[JSS2015] Query Store
[JSS2015] Query Store
 
[JSS2015] 3 DMV's pour evaluer les indexs
[JSS2015] 3 DMV's pour evaluer les indexs[JSS2015] 3 DMV's pour evaluer les indexs
[JSS2015] 3 DMV's pour evaluer les indexs
 
[JSS2015] Power BI: Nouveautés archi et hybrides
[JSS2015] Power BI: Nouveautés archi et hybrides[JSS2015] Power BI: Nouveautés archi et hybrides
[JSS2015] Power BI: Nouveautés archi et hybrides
 
[JSS2015] Infra bi#4 - le scale out
[JSS2015] Infra bi#4 - le scale out[JSS2015] Infra bi#4 - le scale out
[JSS2015] Infra bi#4 - le scale out
 
[JSS2015] In memory and operational analytics
[JSS2015] In memory and operational analytics[JSS2015] In memory and operational analytics
[JSS2015] In memory and operational analytics
 
[JSS2015] Eradiction des deadlocks
[JSS2015] Eradiction des deadlocks[JSS2015] Eradiction des deadlocks
[JSS2015] Eradiction des deadlocks
 
[JSS2015] Architectures Lambda avec Azure Stream Analytics
[JSS2015] Architectures Lambda avec Azure Stream Analytics [JSS2015] Architectures Lambda avec Azure Stream Analytics
[JSS2015] Architectures Lambda avec Azure Stream Analytics
 
[JSS2015] - Azure automation
[JSS2015] - Azure automation[JSS2015] - Azure automation
[JSS2015] - Azure automation
 
[JSS2015] AlwaysOn 2016
[JSS2015] AlwaysOn 2016[JSS2015] AlwaysOn 2016
[JSS2015] AlwaysOn 2016
 
[JSS2015] - Document db et nosql
[JSS2015] - Document db et nosql[JSS2015] - Document db et nosql
[JSS2015] - Document db et nosql
 
[JSS2015] x events
[JSS2015] x events[JSS2015] x events
[JSS2015] x events
 
[JSS2015] Nouveautés SSIS SSRS 2016
[JSS2015] Nouveautés SSIS SSRS 2016[JSS2015] Nouveautés SSIS SSRS 2016
[JSS2015] Nouveautés SSIS SSRS 2016
 
JSS2014 – Hive ou la convergence entre datawarehouse et Big Data
JSS2014 – Hive ou la convergence entre datawarehouse et Big DataJSS2014 – Hive ou la convergence entre datawarehouse et Big Data
JSS2014 – Hive ou la convergence entre datawarehouse et Big Data
 

GUSS - Les IO dans SQL Server (en partenariat avec DataCore)

  • 1. http://GUSS.Pro @GUSS_FRANCE La communauté Data Microsoft Sarah Bessard – Concat Skills - Consultante indépendante Nicolas Souquet – Ivalua – DBA Senior De la requête aux disques en passant par la RAM
  • 2. http://GUSS.Pro @GUSS_FRANCE Rejoignez la communauté Data Webcasts, Conférences, Afterworks La communauté Data Microsoft @GUSS_FRANCE /GUSS /GUSS.FR
  • 4. http://GUSS.Pro @GUSS_FRANCE Hardware I/O Système de stockage DAS, SAN, NAS Type de disque SCSI, SATA, SAS, SSD… Vitesse Nombre de tours (mécanique) Jusqu’à 15 000 tr/min RAID RAID5 RAID6 RAID10 Cache sur le RAID Ecriture
  • 5. http://GUSS.Pro @GUSS_FRANCE Mesures I/O Capacité Go, To Latence Avg Disk sec/Read Avg Disk sec/Write IOPS par sec Disk Reads/sec Disk Writes/sec Débit Mo/Go Disk Read Bytes/sec Disk Write Bytes/sec
  • 8. http://GUSS.Pro @GUSS_FRANCE Outils de benchmark • SQL Server • SQLIOSim : Simuler l’activité de SQL Server (lectures, écritures, checkpoint, sauvegarde, tris et lectures anticipées) • Livré avec SQL Server 2008 et suivants • C:Program FilesMicrosoft SQL ServerMSSQL1X.SQL20XXMSSQLBinn • DiskSpd : nécessite l’apprentissage des paramètres, mais encore plus souple que SQLIOSim • Latences, Avg. Disk Read/Write, … • CrystalDiskMark : permet de tester simplement et rapidement un volume de stockage • Tests TPC (www.tpc.org) • Résultats de tests de charge sur des configurations de stockage
  • 9. http://GUSS.Pro @GUSS_FRANCE Fichiers de bases de données Une base de données est constituée d’au moins deux types de fichiers • DATA (mdf, ndf) : données, index • Type : Aléatoire • Accès : Lecture/Ecriture • Mode : Asynchrone • LOG (ldf): journal de transactions • Type : Séquentiel • Accès : Ecriture, [Lecture] • Mode : Synchrone MDF LDFNDF
  • 10. http://GUSS.Pro @GUSS_FRANCE DATA : Processus de lecture Les données présentes sur disque sont transférées en mémoire pour être lues… Et modifiées au besoin. Application SELECT Disque (MDF, NDF) Page Buffer Cache Page Application Ligne Lecture physique Lecture logique Opérateurs logiques & physiques : Table Scan, Index Seek, Index Scan
  • 11. http://GUSS.Pro @GUSS_FRANCE DATA & LOG : Processus d’écriture • LOG : journal de transactions • Log Writer : Logging • Write-ahead log : ACID • DATA (mdf, ndf) : données, index • Checkpoint : Flush de dirty page automatique, indirect, manuel, interne • Lazy Writer : Mémoire disponible et flush de dirty page • Eager Writer : BULK INSERT, SELECT INTO • Ghost cleanup : Suppression de pages Application INSERT UPDATE DELETE Buffer Cache Page Disque (MDF, NDF) Page Ecriture physique Log Cache Page Disque (LDF) Page WAL Checkpoint Lazy Writer Eager Writer Ghost Cleanup Ecriture physique (Commit Tran) Ecriture logique Log Writer
  • 12. http://GUSS.Pro @GUSS_FRANCE Types et accès I/O par opération Opération Type Accès Taille de block Log : Log Writer Séquentiel Ecriture Up to 60KB Log : Log Reader Séquentiel Lecture Up to 120KB Data : Checkpoint Aléatoire Ecriture Up to 256KB Data : Lazy Writer Aléatoire Ecriture Up to 256KB Data : Index Seeks Aléatoire Lecture 8KB 64KB (read Ahead) Data : Table / Range Scan Séquentiel Lecture 64KB-512KB Data : Bulk Insert Séquentiel Ecriture 64KB-256KB Data & Log : Backup Operations Séquentiel Ecriture 64KB-4MB
  • 13. http://GUSS.Pro @GUSS_FRANCE Structure d’un enregistrement (1/4) • Tous les enregistrements d’une table ou d’un index qui sont de même type ont la même structure physique • Quel que soit le nombre de colonnes qu’ils comptent • Types : • données « utilisateur » : principalement tables et index (format : FixedVar) • bitmaps d’allocation • Stockage spécifique : LOBs, compression (format : CD), FileStream, ColumnStore TagA TagB Fsize FData Ncol NullBits VarCount VarOffset VarData Versioning tag
  • 14. http://GUSS.Pro @GUSS_FRANCE TagA : • 1 octet • Bit 0 : plus utilisé dès SQL Server 2008 (version du type d’enregistrement, toujours à zéro) • Bits 1 à 3 : type d’enregistrement • 0 : enregistrement primaire • 1 : enregistrement transféré • 2: enregistrement transférant • 3 : enregistrement d’index • 4 : sous-chaîne (au sens binaire) de LOB • 5 : enregistrement d’index fantôme* • 6 : enregistrement de données fantôme* • 7 : enregistrement versionné** fantôme* • Bit 4 : l’enregistrement à une bitmap de NULL • Bit 5 : l’enregistrement a des valeurs de longueur variable • Bit 6 : l’enregistrement est versionné** • Bit 7 : plus utilisé dès SQL Server 2008 * cf. processus système GHOSTCLEANUP ** cf. support des niveaux d’isolation de transaction snapshot Structure d’un enregistrement (2/4)
  • 15. http://GUSS.Pro @GUSS_FRANCE TagB : 1 octet. Obsolète dès SQL Server 2008 Fsize : 2 octets. Taille cumulée des colonnes de types de longueur fixe FData : Données dont le type est de longueur fixe NCol : 2 octets. Nombre de colonnes Structure d’un enregistrement (3/4)
  • 16. http://GUSS.Pro @GUSS_FRANCE VarCount : 2 octets. nombre de colonnes de longueur variable VarOffset : (2 * VarCount) octets NullBits : tableau des bitmap de NULL • 1 bit pour chaque colonne de la table, qu’elle soit NULLable ou non • 1 octet jusqu’à 8 colonnes, 2 octets entre 9 et 16 colonnes, etc … • Intérêt : • Il n’est plus nécessaire de stocker des valeurs spéciales pour signifier le NULL • Si on n’a pas cette bitmap, il est difficile d’indiquer qu’une colonne est à NULL • Pour les colonnes de type (n)varchar, c’est ce qui permet de différencier un NULL d’une chaîne de longueur nulle • Cela minimise les cycles CPU : sans elle : • Pour les valeurs dont le type est fixe, il faut lire la valeur de la colonne, et la comparer la « valeur » NULL du type de données de la colonne • Pour les valeurs à longueur variable, je vous laisse imaginer  • Absente au niveau feuille des index non-cluster, et à la racine et dans les niveaux intermédiaires des index cluster et non-cluster si l’ensemble des colonnes clé de l’index ne sont pas NULLable Structure d’un enregistrement (4/4)
  • 17. http://GUSS.Pro @GUSS_FRANCE Structure d’une page Espace libre En-tête : 96 octets 011001110011100111 1111001 0110011100111 011001110 011001110011100011001101 Tableau des offset des lignes 011001110011100011001101 1111 01100100011001101 01010101111 0011101101011010101001 8192 octets8096 octets • Les enregistrements ne sont pas toujours stockés dans l’ordre logique : c’est le tableau des offsets qui l’indique • L’espace libre n’est pas toujours contigu • Le tableau des offsets indique la position de chaque ligne dans la page par des entiers de 2 octets
  • 18. http://GUSS.Pro @GUSS_FRANCE Structure d’une étendue • Groupe de 8 pages physiquement consécutives • Taille : 64Ko • C’est la plus petite unité de travail du moteur de stockage • D’où l’intérêt de tailler les clusters des disques supportant les fichiers de la base à 64Ko • Toujours alignées sur le ”début“ du fichier • Deux types • Partagée • Pour les objets avec une faible quantité de données • Jusqu’à SQL Server 2016 RTM inclus, dans TempDB, si le drapeau de trace 1118 n’est pas activé • Jusqu’à 8 objets • Uniforme • Dédiées à un seul objet (table ou index)
  • 19. http://GUSS.Pro @GUSS_FRANCE Type Signification N° de première page Intervalle entre les pages de ce type But Stockage adressé Nombre de pages adressées File Header 0 - En-tête du fichier Fichier - PFS Page Free Space 1 8088 Trace l’espace libre Page (byte-map) 8088 pages = 64Mo GAM Global Allocation Map 2 511230 Trace l’allocation des étendues uniformes Etendue (bitmap) 8000 octets = 640000 étendues = 4Go SGAM Shared Global Allocation Map 3 511230 Trace l’allocation des étendues partagées DCM Differential Changes Map 6 511230 Trace les étendues qui ont été écrites depuis la dernière sauvegarde complète BCM Bulk Changes Map 7 511230 Trace les étendues qui ont été écrites depuis la dernière sauvegarde du fichier du journal des transactions IAM Index Allocation Map - 512000 Trace les étendues dédiées à une unité d’allocation d’un objet particulier
  • 20. http://GUSS.Pro @GUSS_FRANCE Page Free Space : détails • Bit 1 : indique si la page est allouée ou non • Les GAM et SGAM indique si l’étendue est allouée, mais pas quelles pages dans l’étendue le sont ou non • Bit 2 : Indique si la page provient d’une étendue partagée ou uniforme • Bit 3 : indique si la page est une IAM (les IAM n’ont pas d’emplacement spécifique dans les fichiers de données) • Bit 4 : indique si la page contient des enregistrements fantômes • Bits 5 à 7 : codage sur 3 bits de valeurs de zéro à 4, indiquant le taux de remplissage de la page • 0 : la page est vide • 1 : la page est occupée entre 1 et 50% • 2 : la page est occupée entre 51 et 80% • 3 : la page est occupée entre 81 et 95% • 4 : la page est occupée entre 96 et 100%
  • 21. http://GUSS.Pro @GUSS_FRANCE Index Allocation Map : détails Table IN_ROW ROW_OVERFLOW LOB IAM IN_ROW IAM ROW_OVERFLOW IAM LOB IAM IN_ROW IAM ROW_OVERFLOW IAM LOB 4Go 4Go sys.tables sys.allocation_units Partition sys.partitions
  • 22. http://GUSS.Pro @GUSS_FRANCE  Croissance de fichier  Groupe de fichiers  Partitionnement  Traceflag 1117 : Croissance uniforme  Instant File Initialization  Log non inclus  Tempdb  Compression : table, index  Index Columstore  Vues indexées  In-Memory  DATA en mémoire DATA : Optimisations
  • 24. http://GUSS.Pro @GUSS_FRANCE  Croissance de fichier  MB  Virtual Log Files (VLF)  Règle d’allocation de l’incrément : voir ici  Délai de durabilité Ecriture asynchrone dans les logs Commit de la transaction avant écriture sur disque  Recovery Interval : Checkpoint (indirect)  In-Memory  Logging limité  Durabilité : SCHEMA_ONLY  Affinité CPU pour les I/O : Traceflag 8002  Stockage Tempdb : Disque SSD, local (VS SAN), RAID10 dédié LOG : Optimisations
  • 25. http://GUSS.Pro @GUSS_FRANCE Mesures SQL Server DMV Mesure Granularité sys.dm_io_virtual_file_stats Latence, IOPS Fichier de base de données sys.dm_exec_query_stats IOPS Requête sys.dm_db_index_usage_stats IOPS et opérations (seek, scan, lookup…) Index, Table sys.dm_os_wait_stats Attentes Instance sys.dm_exec_session_wait_stats Attentes Session Xevents Attentes Requête
  • 26. http://GUSS.Pro @GUSS_FRANCE PAGEIOLATCH_* : Transfert disque vers RAM, data page I/O PAGELATCH_* : Sérialisation de l’accès des pages en RAM IO_COMPLETION : Tâches I/O en fin de traitement sur disque, non- data page I/Os WRITELOG : Attente sur fichier de log Log Flush : checkpoint, commit ASYNC_NETWORK_IO : Attente réseau consommation du résultat Curseur Latence réseau Tuning : Requêtes I/O, Index, stockage, driver d’accès aux données Mesures SQL Server
  • 27. http://GUSS.Pro @GUSS_FRANCE .Pro Rejoignez la communauté Data Microsoft Webcasts, Conférences, Afterworks @GUSS_FRANCE /GUSS /GUSS.FR

Notes de l'éditeur

  1. L’en-tête contient : ID de la page, de sa page précédente et suivante object_id, partition_id, allocation_unit_id LSN Nombre total de lignes dans la page index_id et niveau dans l’index Offset du premier emplacement libre Taille de la partie fixe des lignes Somme de contrôle … Le tableau des offsets est écrit « de droite à gauche », en partant de la fin de la page, ce qui permet de maximiser la capacité de stockage L’espace libre n’est compacté que lorsque le moteur sait qu’une nouvelle ligne peut y tenir, et que cet espace libre est fragmenté localement à la page