Les Performances des Requêtes SQL dans le cas d'un simple union
J'ai une requête simple question de réglage, il est
peut-On améliorer les performances de vue qui ont la définition que
SELECT * FROM A
UNION ALL
SELECT * FROM B
et cela fonctionne si mal que ça prend 12 secondes pour 6.5 k Enregistrements
Toute aide est appréciée.
Vous pouvez utiliser Externe Gauche Joiun.Il vous Donnera une chute dans le Temps et de bonnes performances.
Qui me donnera des enregistrements uniquement à partir de la table de gauche, et plus au-dessus suppose que je ne peux pas changer cette requête,
Combien de temps faut-sélectionnez * à partir d'Une? Combien de temps faut-sélectionnez * à partir de B? Sont les types de données similaires dans A et B (pas de conversion implicite qui se passe)?
Sont les colonnes des deux tables identiques c'est à dire même ordre, le type et la taille? Aussi c'est un peu dangereux à l'aide d'un générique sélectionnez un point de vue, parce que si quelqu'un met à jour un tableau en ajoutant une colonne de la vue allait se briser en raison de la disparité dans le nombre de colonnes. Toutefois, si vous sélectionnez explicitement les colonnes de la vue vont continuer à travailler.
Qui SGBD que vous utilisez? Probablement les index manquants. Toutefois, compte tenu de votre dernier commentaire, vous avez perdu des clefs/indices en général?
Qui me donnera des enregistrements uniquement à partir de la table de gauche, et plus au-dessus suppose que je ne peux pas changer cette requête,
Combien de temps faut-sélectionnez * à partir d'Une? Combien de temps faut-sélectionnez * à partir de B? Sont les types de données similaires dans A et B (pas de conversion implicite qui se passe)?
Sont les colonnes des deux tables identiques c'est à dire même ordre, le type et la taille? Aussi c'est un peu dangereux à l'aide d'un générique sélectionnez un point de vue, parce que si quelqu'un met à jour un tableau en ajoutant une colonne de la vue allait se briser en raison de la disparité dans le nombre de colonnes. Toutefois, si vous sélectionnez explicitement les colonnes de la vue vont continuer à travailler.
Qui SGBD que vous utilisez? Probablement les index manquants. Toutefois, compte tenu de votre dernier commentaire, vous avez perdu des clefs/indices en général?
OriginalL'auteur Ashutosh Arya | 2013-08-30
Vous devez vous connecter pour publier un commentaire.
Le problème avec un
union
vue comme ça, c'est que, à l'origine des colonnes des tables ne sont pas accessibles à l'optimiseur via la vue, de sorte que lorsque vous utilisation la vue comme:la clause where est un filtre sur le ensemble ensemble de lignes livrées par la vue, de sorte tous les lignes des deux tables sont traitées après l'union, donc pas d'index sera utilisé.
Pour avoir un espoir à la performance, vous devez obtenir en quelque sorte la condition que vous souhaitez à l'intérieur de la vue et appliquée à chaque table, mais la variable de sorte que vous pouvez appliquer différents critères lorsque vous l'utilisez.
J'ai trouvé un travail autour de qui fait cela. C'est un peu hacky, et ne fonctionne pas pour une utilisation simultanée, mais ça fonctionne! Essayez ceci:
puis de l'utiliser:
En supposant que il y a un indice sur
foo
, que l'index sera utilisé.Attention ici, car il est évident que cette technique ne fonctionne pas lorsque plusieurs exécutions sont effectuées simultanément.
OriginalL'auteur Bohemian
est-il u raison de conserver ces deux pas de la même table, peu importe ce que vous faites, il finira par être horrible. Si possible, envisager une migration vers une table. Si pas, vous pouvez toujours "matérialiser une vue" par l'insertion de tous dans la même chose.
avec cela étant dit, vous n'allez pas être en sélectionnant * sur l'union, s'il y a des conditions spécifiques sur le dessus de la vue, les performances peuvent être améliorées par l'indexation de la colonne.
Il serait utile si vous dites à tout le monde ce spécifique db c'est pour.
OriginalL'auteur Kasumi
Mon meilleur conseil est de limiter le nombre ou les enregistrements sont renvoyés à partir de la source de tables, pour que ce que vous avez vraiment besoin et de vous assurer que vos données sont correctement indexé.
Ne l'utilisez pas * à moins que son ad-hoc script (même alors, il serait encore préférable de lister les colonnes) d'inclure uniquement les colonnes dont vous avez vraiment besoin pour la tâche à portée de main.
Utiliser des index basés sur la plupart des requêtes fréquemment utilisées. Supprimer tous les index inutilisés. Supprimez tous les doublons de index.
Pluralsight a un merveilleux cours sur MS SQL Server réglage des performances de requêtes.
http://www.pluralsight.com/training/Courses/TableOfContents/query-tuning-introduction
Le cours est présenté par Vinod Kumar et Pinal Dave qui sont deux très brillants individus.
Vous pouvez aussi consulter Pinal de l'article sur les Performances de SQL Server à l'aide de point sur les zones que vous ne pouvez pas avoir pensé.
http://blog.sqlauthority.com/sql-server-performance-tuning/
OriginalL'auteur Kyle Wormsbacher