Bonjour,
je constate quelque chose de particulièrement étrange sous SQL Server 2012 (Express Edition).
Soit un serveur lié MySQL nommé linked1.
Ce serveur expose une table t1 de quelques centaines de milliers de lignes, avec une colonne f1 de type DECIMAL(10,0) NOT NULL et contenant des valeurs que nous considèrerons sans importance.
Si j'exécute la requête suivante sous SQL Server (c'est un cas d'école pour mettre en évidence ma problématique)...
... j'ai un temps de réponse de 19 secondes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT 1 FROM OPENQUERY(linked1, 'SELECT f1 FROM t1') WHERE f1=12;
Si j'exécute la requête suivante...
... j'ai un temps de réponse de 8 secondes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT 1 FROM OPENQUERY(linked1, 'SELECT CAST(f1 AS CHAR(20)) as f1b FROM t1') WHERE f1b='12';
J'avoue que ça va à l'encontre de ce que je sais des bases de données.
Dans la deuxième requête, non seulement je perds du temps (de traitement) à transtyper ma colonne sous MySQL mais c'est en plus pour forcer SQL Server à faire une recherche sur une colonne de type caractère plutôt que numérique.
Et le tout va au final deux fois plus vite que la requête initiale !
Si je n'en avais pas fait l'expérience, j'avoue que je ne l'aurais pas cru, tant ça me semble contre-intuitif.
Voyez-vous une explication ? SQL Server traiterait-il d'une manière particulière les données "rapatriées" d'un serveur lié, de telle sorte qu'une colonne de type caractère renvoyée par MySQL permettrait en effet d'améliorer les performances côté SQL Server ?
Merci d'avance pour vos lumières.
Partager