2008-11-27 6 views
1

Je n'arrive pas à essayer d'optimiser la requête suivante pour le serveur SQL 2005. Est-ce que quelqu'un sait comment l'améliorer? Chacune des tables utilisées contient environ 40 millions de lignes chacune. J'ai essayé de mon mieux pour l'optimiser mais je réussis à faire exactement le contraire.Optimisation des unions

Merci

SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2005 
    union all 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2006 
    union all 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2007 
    UNION ALL 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2008 

Peut-être que je aurais dû dire quelque chose d'autre sur le schéma, toutes les tables utilisées ici sont des tableaux historiques, ils ne sont pas référencées à une autre table. Et theres déjà un index pour cos et SIN. Je me demandais s'il y avait une autre façon d'optimiser la requête ... comme vous pouvez l'imaginer, les enregistrements 160millon sont difficiles à obtenir: s

+0

L'optimisation des requêtes est généralement impossible sans connaître le schéma et ce que vous essayez d'obtenir. – Rowan

+0

Quel genre de rapport aurait besoin de 160 millions de lignes, sans totaux, sans groupes, sans tri, à quoi cela servirait-il? – dkretz

+0

Avez-vous besoin d'une entrée en double? peut-être pourriez-vous filtrer cela pour obtenir moins de lignes? – Fredou

Répondre

2

Il semble que la requête ne fait que combiner les tables d'historique séparées dans un ensemble de résultats unique contenant toutes les données. Dans ce cas, la requête est déjà optimale.

+0

j'avais peur que quelqu'un dirait que .. merci. –

1

Mettez un indice composite sur cos et sin sur chacune des tables. C'est aussi bon que vous allez obtenir sans restructurer la conception de la table (dans cet exemple, il semble que vous devriez avoir 1 table pour commencer)

+0

Comment les index aideraient-ils puisqu'il ne filtre pas par n'importe quoi. – Rowan

+0

Étant donné que vous ne sélectionnez que ces deux colonnes, le serveur SQL peut simplement obtenir les données directement à partir de l'index composite au lieu de devoir cliquer sur l'enregistrement de données réel. Ce sera seulement une amélioration si vous avez d'autres colonnes dans vos tableaux. –

+0

Oh ouais, je n'y ai pas pensé. – Rowan

1

Puisqu'il n'y a pas de clause WHERE, je ne crois pas que vous puissiez faire quoi que ce soit pour améliorer les performances de cette PoV.

Vous avez correctement utilisé UNION ALL, il n'y a pas d'aide.

La seule autre chose que je peux penser est de savoir s'il y a plus de colonnes sur les tables? Si tel est le cas, il se peut que vous récupériez plus de données à partir du disque que nécessaire, ralentissant ainsi la requête.

+0

les tableaux ont environ 10 colonnes de plus, la table a un index composite sur ceux des colonnes ... il semble qu'il ne sera pas mieux que ce merci pour la réponse. –

2

Une autre approche serait de s'attaquer au problème de savoir pourquoi avez-vous besoin des 160 millions de lignes? Si vous effectuez une sorte de reporting, pouvez-vous créer des tables de reporting distinctes dont certaines données sont déjà agrégées. Ou avez-vous réellement besoin d'un entrepôt de données pour répondre à vos besoins de reporting.

+0

J'ai besoin de ces 160 millions de lignes à des fins de reporting, mais c'est assez clair, je vais devoir trouver une approche différente. J'essayais d'éviter d'avoir à faire cela, mais je suppose que je vais devoir ... obtenir ces 160 millions de lignes rapides est difficile: p merci –

1

Il peut être intéressant d'expérimenter avec des vues indexées. Vous pourriez mettre la déclaration ci-dessus dans une vue avec les index suggérés par Dave. Cela prendrait un peu de temps à construire au début, mais retournerait vos résultats un peu plus rapidement (ceci est basé sur l'hypothèse que l'ensemble de données ne change pas beaucoup et que vous pouvez donc supporter les frais supplémentaires transactionnels).

+0

je vais essayer différents index, mais je ne pense pas que je vais expérimenter de grandes améliorations. merci –

0

Vous pouvez envisager d'utiliser une seule table partitionnée avec un indicateur d'année. Je suis toujours curieux - est ce code dans une vue ou SP qui fonctionne sur des lignes de 160m ou est-ce qu'il va effectivement retourner 160m lignes le long du fil. Si c'est le cas, il y a énormément de données à retourner, ce qui en fait un extrait et il faudra un certain temps avant que cela n'arrive.

0

Aucune optimisation à effectuer. Puisque vous sélectionnez tous les enregistrements de toutes les tables, vous obtenez par définition tous les enregistrements de toutes les tables d'un ensemble de résultats.

Quelle est la raison pour cela?