septembre
2010
Le « Tipping point » qu’on peut traduire littérallement par point de basculement, correspond à la situation où un index non cluster n’est pas utilisé par l’optimiseur dans le cas d’une requête SARGable. Je préfère utiliser le terme Zone (ou ligne) de basculement que le terme « point de basculement » (Tipping point) parce qu’il me semble que la notion de point n’existe pas dans une base de données !
En mathématique, le point de basculement existe. Par exemple lorsqu’on étudie une fonction de second dégré qui est sous la forme de f(x) = ax² + bx + c, on se rend compte que cette fonction possède un point particulier appelé EXTREMUM. Ce dernier apparaît lorsque la dérivée première de la fonction s’annule et change de signe. Là il s’agit bien d’un POINT de basculement!
Le même phénomène peut être mis en évidence en Physique, lorsqu’on s’interesse à l’étude des trajectoires paraboliques. L’exemple le plus simple dans ce cas est l’étude de la trajectoire d’une balle de basket lorsqu’un joueur fait un tir à 3 points. La trajectoire décrite par la balle est telle que lors du lancement, elle monte, atteint une hauteur maximale puis redescend dans le panier (si le tir est bon !). L’instant où la balle atteint une hauteur maximale (encore appelé flêche) est un POINT de basculement.
Mais en base de données il n’existe pas de POINT ! il existe des lignes (suite de colonnes).
Pour revenir à la zone de basculement dans la cas d’une base de données, Kimberly L. Tripp a publié un article sur le sujet.
Elle a présenté une méthode théorique d’ESTIMATION de cette zone rouge. Disons-le tout de suite, ce n’est qu’une estimation car beaucoup de paramètres peuvent influencer cette zone. La seule façon de savoir si l’optimiseur n’utilsera pas un index non cluster c’est de faire le test et analyser le plan d’exécution.
Voici néanmoins une requête qui permet d’obtenir pour chaque table d’une base de données les limites théoriques de la zone de basculement
SELECT OBJECT_NAME(object_id) AS [NomTable]
, record_count AS [Nombre lignes]
, page_count AS [Nombre pages]
, ROUND(page_count * .25 ,0,1) AS [Limite Inférieure Zone Basculement (nombre de lignes)]
, ROUND(page_count * .33 ,0,1) AS [Limite Supérieure Zone Basculement (nombre de lignes)]
, ROUND(((page_count * .25)/record_count * 100),1) AS [Limite Inférieure Zone Basculement (%)]
, ROUND(((page_count * .33)/record_count * 100),1) AS [Limite Supérieure Zone Basculement (%)]
FROM sys.dm_db_index_physical_stats (DB_ID(), null, null, null, 'DETAILED')
WHERE index_id IN (0,1)
AND page_count > 15 -- Je m'interesse ici aux tables ayant + de 15 pages, vous pouvez modifier cette valeur
ORDER BY [Nombre lignes] DESC
————————————————————————————————————-
Auteur : Etienne ZINZINDOHOUE