SQLSaturday Paris 2015 Plans d’execution Optimisations
SQLSaturday Paris 2015 Speakers David BARBARIN Société : Expérience MSSQL : ~ depuis 2002, SQL Server 7 à 2016 Site / Blog : Mail : Sarah BESSARD Société : Expérience MSSQL : ~ depuis 2006, SQL Server 7 à 2014 Site / Blog : Mail :
SQLSaturday Paris 2015 Merci à nos sponsors…
SQLSaturday Paris 2015 Merci à nos volontaires…
SQLSaturday Paris 2015 Agenda Optimisateur de requêtes Mécanisme de cache Patterns d’optimisation La face cachée de l’optimiseur
SQLSaturday Paris 2015 Optimiseur de requête - architecture Simplification Trivial plan Statistics loading Exploration (phases) Convert to executable plan
SQLSaturday Paris 2015 Optimiseur de requête – Sortie Parsing/Binding : Arbre logique SELECT c.StoreID, COUNT(*) AS CountOrders FROM Sales.Customer c INNER JOIN Sales.SalesOrderHeader h ON c.CustomerID = h.CustomerID WHEREh.OrderDate > ' ' GROUP BY c.StoreID
SQLSaturday Paris 2015 Optimiseur de requête – Phase de simplification Simplification Trivial plan Statistics loading Exploration (phases) Convert to executable plan Constant folding Domain simplification Predicate push-down Join simplification Contradictions
SQLSaturday Paris 2015 Optimiseur de requête – Plusieurs plans possible ou Trivial ? Simplification Trivial plan Statistics loading Exploration (phases) Convert to executable plan
SQLSaturday Paris 2015 Optimiseur de requête – Statistics loading Simplification Trivial plan Statistics loading Exploration (phases) Convert to executable plan
SQLSaturday Paris 2015 Optimiseur de requête – Processus de recompilation et statistiques Cache lookup Query optimization Load all of interesting statistics Are stats stale? Refresh all of the stats that need refreshing Generates the query plan Set recompilation thresholds of all the tables referenced in the query Check the query plan for correctness related reasons (schema checks) Schema valid? Do we have newer stats available? Any stats stale? Begin query execution Failure Yes No Yes
SQLSaturday Paris 2015 Mécanisme de cache – Introduction Begin query execution Simplification Trivial plan Statistics loading Exploration (phases) Convert to executable plan By pass Next query Reuse execution plan in cache Compilation
SQLSaturday Paris 2015 Cache et objets compilés Objtype = ‘Proc’ Procédures stockées, triggers, UDFs et TVFs Requêtes préparées Contrôle total des paramètres d’entrées (domaine et type) Recompilation des plans d’exécutions WITH RECOMPILE vs OPTION (RECOMPILE) “parameter sniffing”
SQLSaturday Paris 2015 Patterns d’optimisation Kitchen Sink Search ARGumentable #Temp Filtre résiduel
SQLSaturday Paris 2015 Patterns d’optimisation : Kitchen Sink INT = NULL DATETIME = ' ' DATETIME = NULL MONEY = 1000 SELECT SalesOrderID FROMSales.SalesOrderHeader WHERE IS NULL OR CustomerId AND IS NULL OR OrderDate AND IS NULL OR OrderDate AND IS NULL OR TotalDue
SQLSaturday Paris 2015 Patterns d’optimisation : Kitchen Sink (variante) INT = NULL DATETIME = ' ' DATETIME = NULL MONEY = 1000 SELECT SalesOrderID FROMSales.SalesOrderHeader WHERE CustomerId = CustomerId) AND OrderDate >= OrderDate) AND OrderDate <= OrderDate) AND TotalDue >= TotalDue )
SQLSaturday Paris 2015 Patterns d’optimisation : Kitchen Sink VS sp_executesql INT = NULL DATETIME = ' ' DATETIME = NULL MONEY = 1000 AS NVARCHAR(1500) AS NVARCHAR(100) = MONEY' = ' SELECT SaleOrderId ' += ' FROMSales.SalesOrderHeader ' += ' WHERE 1 = 1 ' IS NOT NULL += ' AND CustomerId IS NOT NULL IS NOT NULL += ' AND OrderDate IS NOT NULL += ' AND TotalDue
SQLSaturday Paris 2015 Patterns d’optimisation : Condition sargable (Search ARGumentable) Condition non sargableCondition sargable SELECT * FROM Person.Person WHERE LastName LIKE '%Ledyard' SELECT * FROM Person.Person WHERE LastName LIKE 'Ledyard%' SELECT * FROM Sales.SalesOrderHeader WHERE CONVERT(CHAR(10), OrderDate, 103) = 103) SELECT * FROM Sales.SalesOrderHeader WHERE OrderDate >= AS DATE) AND OrderDate < CAST(DATEADD(DAY, AS DATE) SELECT * FROM Person.Person WHERE UPPER(LastName) -- Use COLLATION French_CI_AI on column « LastName » SELECT * FROM Person.Person WHERE LastName
SQLSaturday Paris 2015 Patterns d’optimisation : #Temp StockageTempdb Nombre de lignes max.Non< 1000 lignes StatistiquesOuiSQL Server 2014 : Oui Traceflag 2453 Index/KeyOui1 PK / 1 UK SQL Server 2014 : Oui TruncateOuiNon RecompilationOuiNon ParallélismeOuiNon TransactionOuiNon ScopeGlobal (##), 1 session (#)1 session
SQLSaturday Paris 2015 Patterns d’optimisation : Filtre résiduel SELECT p1.ListPrice FROMProduction.Product p1 INNER JOIN Production.Product p2 ON p1.ProductSubcategoryID = p2.ProductSubcategoryID AND p1.ListPrice - p2.ListPrice = 0
SQLSaturday Paris 2015 La face cachée de l’optimiseur
SQLSaturday Paris 2015 Questions
SQLSaturday Paris 2015 …Et en plus on peut gagner des cadeaux