Venez découvrir les méthodes, outils et best practices utilisés par les experts du Support Microsoft pour identifier et corrigier les problèmes de performances sur SQL Serveur ou tout simplement en optimiser les performances. Cette session présentée par nos spécialistes au Support SQL Serveur en France, sera pour vous une occasion unique de les rencontrer ! Avec environ 50% de contenu original pour cesTechdays, nous aborderons entre autre la gestion des index, du columns store ou encore de la compression, nous vous présenterons également les outils utilisés et la manière de les utiliser.
Analyse et optimisation des performances du moteur SQL Serveur
1. Analyse et optimisation des
performances du moteur
SQL Serveur
10 février 2011
Frédéric Pichaut
EMEA SR ESCALATION ENGINEER
Microsoft France
2. Agenda
Quelques Bases
Gestion de la mémoire avec SQL 2012
ColumnStore Index
Les statistiques
Gestion des index
Méthodologie
Les outils
Avec le produit (DTA, Xevent, XE Profiler, SQLDiag)
Extérieurs (SQLDiag, PSSDiag, SQL Nexus)
3. Quelques Bases
L’optimiseur
Son rôle est de déterminer le chemin d’accès au données
Il est basé sur la notion de coût (Cost-Based Optimizer)
Génération de plans d’exécutions
Les indexes sont propres à chaque optimiseur
Structure sur disque associée à une table qui accélère l'extraction des lignes
Cluster
Trie et stocke les lignes de données de la table en fonction de la clé.
Un Cluster index peut être défini non-unique mais en interne il le sera toujours.
Non-cluster
Peuvent être définis sur une table dotée d'un indexe cluster ou non
Chaque ligne contient la clé cluster index ou un localisateur de ligne (RID) s’il n’y a pas de CI
Possibilité d’indexes sur des colonnes calculées par des fonctions
CHECKSUM, fonction utilisable pour des « hash indexes »
ALTER TABLE Product ADD cs_Pname AS CHECKSUM(Name);
CREATE INDEX Pname_index ON Product (cs_Pname)
Possibilité d’indexes avec des colonnes incluses
CREATE NONCLUSTERED INDEX IncIndex ON Product (ID) INCLUDE (Prix)
Possibilité d’indexes filtrés:
CREATE NONCLUSTERED INDEX FiltIndex ON Product (Name, Price)
WHERE CatID >= 27 AND CatID <= 36;
SQL12 – Indexes de type “Column Store Index (CSI)”
4. Gestion de la mémoire avec SQL
2012
SQL Server 2012 introduit un nouveau « page allocator » qui contrôle
les demandes de « single page » et « multi page »
Le nouveau « any size page allocator » gère les demandes de
8KB et plus.
Les demandes de Multi-Page et CLR sont maintenant inclus dans
l’espace mémoire contrôlé par « max server memory (MB) »
max server memory
Détermine la mémoire physique max (committed memory)
Le min passe de 16 MB à 64 MB (x86) ou 128 MB (X64).
L’espace « memory_to_reserve » (-g) n’inclus plus les demandes de
« multi-page ». En dehors de ca, tout reste identique pour cette
espace.
L’option « awe enabled » n’est plus supportée.
L’option « Lock Pages In Memory » est supporté pour les éditions
Enterprise, Standard et Business Intelligence (pas pour les autres
éditions).
Plus besoin de Hotfix, Trace Flag ou « AWE »
5. ColumnStore Index (CSI)
Accélération
Nouvel algorithme de l’optimiseur BATCH
Produit et interprète les batch, chacun contenant ~1000 valeurs
compressées
Requêtes Data Warehouse ou jointure en étoile
Utilise la compression Vertipaq
Moins d’IO
Limitations
Pas d’Updates directe dans la table
Rebuild Index/Partition Switching
Pas de Large Data Types
Decimal > 18 digits
Uniqueidentifier
Binary et BLOBs
6. Columnstore Index
Traditionnellement les
données sont stockées Data Pages
dans des pages lignes par
lignes
On utilise le terme « row
store » pour décrire une …
Heap ou un B-Tree ayant
plusieurs ligne par page
7. Columnstore Index
Select region, sum(sales), …
Un Segment contiens les
valeurs d’une colonne pour un
ensemble de lignes Segment
Les segments pour un même
groupe de lignes constitues C3 C5
un « row group »
Les segments sont
compressés
Chaque segment est stocké
dans un BLOB
Le segment est l’unité de Row
transfert entre le disque et la group
mémoire.
Estimation de la mémoire
nécessaire pour créer un CSI
:
DOP * (nb col * 4.2M + 68.1M)
+ (nb string col * 53.7M)
8. Exemple de performance
Base du TPC-DS de 1 TB
1.44 milliard de lignes dans la table de faits catalog_sales
SELECT w_city, w_state, d_year, SUM(cs_sales_price) AS cs_sales_price
FROM warehouse, catalog_sales, date_dim
WHERE w_warehouse_sk = cs_warehouse_sk
and cs_sold_date_sk = d_date_sk and w_state in ('SD','OH')
and d_year in (2001,2002,2003)
GROUP BY w_city, w_state, d_year
ORDER BY d_year, w_state, w_city;
Total CPU time Elapsed time
No columnstore 502 sec 501 sec
Columnstore 31.0 sec 1.10 sec
Speedup 16X 455X
9. Les Statistiques
Utilisées par l'optimiseur pour évaluer la sélectivité des
expressions, et donc la taille des résultats intermédiaires
et finaux
Sur chaque indexes, elles peuvent être:
Crées/Mises à jour automatiquement ou manuellement
Mises à jour en synchrone ou en asynchrone
Basées sur un échantillonnage ou toutes les valeurs
Elles peuvent être filtrées:
CREATE STATISTICS FSPoids ON Produit (Poids) WHERE CatID IN
(1,2,3);
Elles peuvent être sur des colonnes calculées si le résultat
est déterministe.
sys.dm_db_stats_properties en 2008 R2 SP2 (puis 2012)
SELECT
sp.stats_id, name, filter_definition, last_updated, rows, rows_sampled, steps,
unfiltered_rows, modification_counter FROM sys.stats stat CROSS APPLY
sys.dm_db_stats_properties(stat.object_id, stat.stats_id) sp
WHERE stat.object_id = object_id('FactResellerSalesPartCopy_part')
10. Démo
Statistiques
Table compressée
Index filtré
Column Store Index
Update
11. Reconstruction d’indexe
Reconstruire un indexe le supprime et crée un nouveau
(online ou offline).
ALTER INDEX … REBUILD;
CREATE INDEX … DROP_EXISTING;
Désactiver Nc Indexes pour économiser l’espace
SQL 2012: REBUILD ONLINE pour les LOB (sauf
TEXT/IMAGE/FILESTREAM)
FOREIGN KEY référençant l’indexes seront désactivées
ALTER INDEX REBUILD CREATE INDEX WITH
DROP_EXISTING
Ajour ou suppression de colonnes changement de Non Oui
l’ordre ou du tri
Options de l’indexe a positionner Oui Oui
Plus d’un indexe à reconstruire en une transaction Oui Non
un indexe partitionné peut être repartitionné Non Oui
un indexe peut être déplacé sur un autre fichier Non Oui
Demande de l’espace temporaire supplémentaire Oui Oui
Reconstruire un indexe cluster reconstruit les Non (sauf si ALL) Non (sauf si ALL)
indexes non cluster
Single index partition à reconstruire Oui Non
12. Réorganisation d’indexe
ALTER INDEX … REORGANIZE
Toujours « Online »
Réorganise les feuilles de l’indexe en ordonnant les
pages (de gauche a droite)
Les pages sont réorganisées en utilisant les pages
existantes (pas d’allocation)
Le réorganisation est faite par fichier
Compacte les pages
Utilise un minimum de ressource
Les Blobs sont compactés par défaut quand un indexe
Cluster est réorganisé
13. Quand?
Utiliser la fonction :
sys.dm_db_index_physical_stats()
Regarder la valeur:avg_fragmentation_in_percent
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM
sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(N'Production.Product'),
NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id =
b.index_id;
avg_fragmentation_in_percent Action
> 5% et < = 30% ALTER INDEX REORGANIZE
> 30% ALTER INDEX REBUILD WITH (ONLINE = ON)
Ne pas perdre du temps sur petits indexes (mixed
extents).
14. Méthodologie
L’analyse de performance est un perpétuel
recommencement
Quand on pense en avoir fini, un changement survient
Capture
Charge du
Analyse
système
Reglages
16. Les outils Standard
Dynamic Management Views
(DMVs) Server Level Component Level
Plus de 70 dm_exec_* dm_repl_*
Toujours disponible Execution of user Replication
Des rapports prédéfini code and associated dm_broker_*
Performance Dashboard (web 2008) connections
SQL Service
Performance Data Colector (2008) dm_os_* Broker
Memory, locking & dm_fts_*
scheduling
SQL Profiler (SQL Trace) dm_tran_*
Full Text Search
Grand nombre d’event capturable Transactions &
dm_qn_*
Combiné avec Perfmon isolation Query
Va disparaitre Notifications
dm_io_*
dm_clr_*
I/O on network and
Xevent disks Common
Language
Utilise la techno ETW dm_db_* Runtime
5% de CPU pour 20000 event/sec Databases and
Intégré dans le moteur database objects
Database Tuning Advisor (DTA)
Successeur de l’Index Tuning Wizard
Plus robuste, moins de restrictions
Possibilité de Capacity Planing
Perfmon
Toujours plus de compteurs
17. SQL 2012 DTA
Tuning des 1000 top Events du Plan Cache
Option –n du TDA.EXE pour changer le nombre d’Event
18. Xevent
Introduit avec SQL 2008
Événements (Event): points d’intérêt dans le flot
d’exécution du code.
Cibles (Target): Ou stoquer l’evenement capturé (Event
file, Ring buffer,…)
Actions: Collecte d’information, Stack dump, …
Types: Définit les types de données utilisés
Prédicats: mécanisme de filtrage, permet de diminuer
davantage l’empreinte de XE sur les performances
Maps: table de correspondance clés / valeurs (genre
d’EventSubClass plus poussé).
19. XE Profiler
SQL Trace
Va disparaitre
Events Portés – Inclus dans le moteur
Intégré à Management Studio (SSMS)
Create, Alter, Stop, Start Sessions
Possibilité de voir les données sous forme de grille
Fonctions avancées
Searching
Aggregation (Sum, Min, Max, …)
Sorting
Grouping
Custom Columns (Ex: connect_options, sql_text = text)
External Action Event: XEDEVPKG.DLL
Alter Alter
Create Start
Extended Event Extended Event
Session existe Session active
Drop Stop
Drop
20. Problème de cardinalités
inaccurate_cardinality_estimate
(debug channel)
Démarrer la sessions XE et regarder
« live data »
Sur une requête en cours, nous
n’avons pas le plan d’execution
actuel mais en quelques secondes
CE
Utiliser le plan_handle et
dm_exec_query_plan, pour trouver
le plan et le node_id
21. PSSDiag
S’appuie sur SQLDiag + Diagnostiques particuliers
Exemples: DMV, clone db, msdb backup
Contrôlé par les mêmes fichiers XML que SQLDiag, les diagnostiques
particuliers sont ajoutés comme:
<CustomGroup name="msinfo" enabled="true" />
<CustomTask enabled="true" groupname="MsInfo"
taskname="Get MSINFO32" type="Utility" point="Startup"
wait="OnlyOnShutdown" cmd="start /B /WAIT MSInfo32.exe
/computer %server% /report
"%output_path%%server%_MSINFO32.TXT" /categories
Pssdiag and Sqldiag Manager
Disponible sur http://diagmanager.codeplex.com/
Pour SQL 7.0 jusqu’à SQL 2008 R2
22.
23. Démo
XEvent
Interface
Generate dump on error
Fire external Action
inaccurate_cardinality_estimate detection
24. PSSDiag Best Practices I/O
Une capture à la fois.
Eviter GUI, SQLDiag est non graphique (SQLTrace).
Utiliser un ficher de sortie local avec un bon cache d’écriture, Pas de
share sur le réseau. KB307786
Ne pas utiliser un path UNC, même s’il pointe en local.
Utiliser le disque disponible le plus rapide pas utilisé par SQL (ou
autre). Eviter RAID-5.
Tester sur un environnement autre que production ou pas pendant
heures de production.
25. Best Practices – Capture
Eviter les évènements trop fréquents comme : Object:Opened,
Lock:Acquired/Released, etc...
Par défaut Batch-level, pas Statement-level.
Show Plan Statistics consomme beaucoup de CPU, généralement
capturer Showplan Statistics Profile et/ou Showplan XML Statistics
Profile. Showplan All est utile dans le cas de requête ne se finissant
pas.
Les filtres réduisent la taille des fichiers et les I/O mais augmentent la
consommation CPU. Filtrer sur des colonnes de type Integer (dbid,
duration, etc) plutôt que sur des textes (database name, textdata, etc)
et uniquement si les filtres enlèvent >10% des évènements.
26. Best Practices – Capture 2
Evènements qui impactent la taille de la trace:
SQL:StmtCompleted et SP:StmtCompleted
Degree of Parallelism
Lock:Timeout
Show Plan Statistics
SQL:BatchStarting
RPC:Starting
27. RML & SQL Nexus
RML Utilities for SQL Server http://support.microsoft.com/kb/944837
ReadTrace
Paramétrage des requêtes
Agrégation des exécutions
Analyse de performance (Top n)
Reporter
OStress
Agent de contrôle OStress relecture (ORCA)
SQL Nexus Download depuis http://sqlnexus.codeplex.com/
Importer les traces SQLDiag + PerfStats
Analyser vos donnée
Utilise SQL Server Reporting Services client-side report viewer
29. PerfMon – Principaux
compteurs
Logical disk
Avg disk sec/read < 10-20ms, sec/write < 3-5ms
Disk reads/sec, Disk writes/sec
Memory - Available MBytes
MSSQL Buffer Manager - Page Life Expectancy
MSSQL Databases - Active Transactions, Backup/Restore
Throughput/sec, Repl. Pending Xacts, Repl. Trans.
Rate, Transactions/sec
MSSQL Memory Manager - Total Server Memory, Target Server
Memory
MSSQL Plan Cache - Cache Hit Ratio (all instances)
MSSQL Wait Statistics - (all)
Process - % Processor Time (all instances)
Processor - % Processor Time (all instances)
30. Resources
Troubleshooting Performance Problems in SQL Server 2008
Reorganizing and Rebuilding Indexes
Statistiques utilisées par l'optimiseur de requête dans Microsoft SQL
Server 2005
Rechercher des problèmes de délai d'E/S dans le sous-système d'E/S
disque
Optimisation des performances de la base de données tempdb
Et l’ultime recours
31. Pour aller plus loin…
Venez nous voir sur le stand SQL Server
Retrouvez les experts Microsoft et MVP
Assistez à des présentations des offres de nos
partenaires
Inscrivez-vous au « Virtual Launch Event » du 8 mars :
http://aka.ms/vlefrance
Visitez notre nouveau site : http://www.microsoft.fr/sql
Evaluez dès aujourd’hui SQL Server 2012
En téléchargeant la RC0 : http://aka.ms/sql2012
En suivant nos « Virtual Labs » : http://aka.ms/sqllabs
The following table provides the requirements to enable "locked pages" in different versions, editions and platforms of SQL Server.Enterprise EditionData Center EditionStandard EditionBusiness Intelligence EditionOther editionsSQL 2012 [32-bit & 64-bit] • Assign LPIM user right to SQL Startup account • Assign LPIM user right to SQL Startup account No support for "locked pages" SQL 2005/2008/2008R2 [32-bit] • Assign LPIM user right to SQL Startup account• Configure 'awe enabled' option to 1 • Assign LPIM user right to SQL Startup account• Configure 'awe enabled' option to 1 No support for "locked pages" SQL 2005/2008/2008R2 [64-bit] • Assign LPIM user right to SQL Startup account • Assign LPIM user right to SQL Startup account• Apply SQL Hotfix KBA 970070• Enable trace flag 845 No support for "locked pages"
Below is a high-level summary of all changes related to memory management in SQL Server 2012.· The new memory manager supports allocations of all sizes. There is no concept of single-page allocator and multi-page allocator. For any of these sizes, the memory manager supports the three available memory models. The three memory models available in the SQL Server are conventional, lock pages, large pages. Large page is available only in 64 bit.· The new memory manager can be tuned for specific workloads [examples: SQL Server relational engine, SQL Server reporting service, etc]. These tuning options are available for the component developers and not exposed to the external customers or DBA's.· The new memory manager supports locality [CPU and NUMA] for allocations of all sizes. The memory node is created for all NUMA nodes even if there are no CPU's used there. That memory node is set offline.· The management of virtual address space is dynamic now - especially in 32-bit instances of SQL Server.· The configuration option "max server memory" now controls all the memory allocations done by the SQL Server memory manager. This is different from what the previous versions of SQL Server accounted for. As a result, resource governor is now able to control all page allocations.· AWE feature to map more physical memory in 32-bit virtual address space is removed from SQL Server memory manager· The SQL Server Buffer is a pure client of the SQL Server memory manager.
Statisticques: Server sql11scenario1.sql auto updatescenario2.sql statistics filtré
When a nonclustered index is disabled, the index data rows are deleted, but the index definition remains in metadata. The index is enabled when it is rebuilt. When the nonclustered index is not disabled, the rebuild operation requires enough temporary disk space to store both the old and new index. However, by disabling and rebuilding a nonclustered index in separate transactions, the disk space made available by disabling the index can be reused by the subsequent rebuild or any other operation. No additional space is required except for temporary disk space for sorting, which is typically 20 percent of the index size. If the nonclustered index is on the primary key, any active, referencing FOREIGN KEY constraints will automatically be disabled. These constraints must be manually enabled after the index is rebuilt.
5 minDemo:Start sessionAdd watch live data sessionPopulate demo tableExecute artificial long running queryExplain that we will have CE issue due to parameter sniffingWhile the query is still running, we see the XESelect from sys.dm_exec_query_plan using the plan handle to see the plan and find node_id