2017-06-13 2 views
0

J'essaie de faire une jointure entre 8 tables et parce que chaque table a plus de 500 000 entrées, c'est très lent. Je veux savoir, avez-vous le meilleur moyen de rejoindre ces tables?Joindre plusieurs tables avec la même structure mais des données différentes

Toutes les tables a cette structure:

data_temprature:

+----+----------+-----+-----------+----------+ 
| ID_geo | NAME  | Value | Date   | 
+--------+----------+-------+-----------------+ 
| 10005 | Madrid | 32 | 2017-06-12 08:00| 
| 10005 | Madrid | 25 | 2017-06-12 09:00| 
| 12701 | Paris | 23 | 2017-06-12 08:00| 
| 13006 | Tokyo | 25 | 2017-06-12 11:00| 
| 11132 | Sevilla | 27 | 2017-06-12 16:00| 
| 21333 | London | 22 | 2017-06-12 17:00| 
+--------+----------+-------+-----------------+ 

data_WeatherSimbol

+----+----------+-----+-----------+----------+ 
| ID_geo | NAME  | Value | Date   | 
+--------+----------+-------+-----------------+ 
| 10005 | Madrid | A+ | 2017-06-12 08:00| 
| 10005 | Madrid | A | 2017-06-12 09:00| 
| 12701 | Paris | A- | 2017-06-12 08:00| 
| 13006 | Tokyo | C- | 2017-06-12 11:00| 
| 11132 | Sevilla | I+ | 2017-06-12 16:00| 
| 21333 | London | D- | 2017-06-12 17:00| 
+--------+----------+-------+-----------------+ 

Je veux faire une jointure pour obtenir ce résultat:

+----+----------+-----+-----------+----------+-----------------+ 
| ID_geo | NAME  | Temperature | Simboles |  Date  | 
+--------+----------+-------------+----------+-----------------+ 
| 10005 | Madrid |  32  | A+ | 2017-06-12 08:00| 
| 10005 | Madrid |  25  | A  | 2017-06-12 09:00| 
| 12701 | Paris |  23  | A- | 2017-06-12 08:00| 
| 13006 | Tokyo |  25  | C- | 2017-06-12 11:00| 
| 11132 | Sevilla |  27  | I+ | 2017-06-12 16:00| 
| 21333 | London |  22  | D- | 2017-06-12 17:00| 
+--------+----------+-------------+----------+-----------------+ 

T écheveaux

MISE À JOUR DE DONNÉES DE REAL FOURNIR:

Le plan d'exécution: https://files.fm/u/b4besk27

c'est la requête:

SELECT 
    cielo.data_value AS cielo, 
    lluv.data_value AS lluvia, 
    temp.data_value AS temp, 
    vientos.data_value AS viento, 
    tmin.data_value AS tempmin, 
    tmax.data_value AS tempmax, 
    cielo.data_date AS DiaPrev 
FROM 
    data_cielo AS cielo 
INNER JOIN data_lluvia AS lluv ON cielo.data_geo = lluv.data_geo 
INNER JOIN data_presion AS pres ON cielo.data_geo = pres.data_geo 
INNER JOIN data_temp AS temp ON cielo.data_geo = temp.data_geo 
LEFT JOIN data_tempmax AS tmax ON cielo.data_geo = tmax.data_geo 
LEFT JOIN data_tempmin AS tmin ON cielo.data_geo = tmin.data_geo 
INNER JOIN data_viento AS vientos ON cielo.data_geo = vientos.data_geo 

WHERE 
    cielo.data_date = lluv.data_date 
AND pres.data_date = cielo.data_date 
AND vientos.data_date = pres.data_date 
AND temp.data_date = vientos.data_date 
AND cielo.data_geo = 46 ORDER BY cielo.data_date; 
and this is the result: 

E+ 0.0461028 29.6937088 S2 19.408 36.39 2017-06-13 12:00:00.000 
E+ 0.0461028 29.6937088 S2 21.422 36.39 2017-06-13 12:00:00.000 
E+ 0.0461028 29.6937088 S2 19.408 37.853 2017-06-13 12:00:00.000 
E+ 0.0461028 29.6937088 S2 21.422 37.853 2017-06-13 12:00:00.000 
E+ 0.0461028 30.7593854 S2 19.408 36.39 2017-06-13 13:00:00.000 
E+ 0.0461028 30.7593854 S2 21.422 36.39 2017-06-13 13:00:00.000 
E+ 0.0461028 30.7593854 S2 19.408 37.853 2017-06-13 13:00:00.000 
E+ 0.0461028 30.7593854 S2 21.422 37.853 2017-06-13 13:00:00.000 
A+ 0.0461028 31.6310774 SSW2 19.408 36.39 2017-06-13 14:00:00.000 
A+ 0.0461028 31.6310774 SSW2 21.422 36.39 2017-06-13 14:00:00.000 
A+ 0.0461028 31.6310774 SSW2 19.408 37.853 2017-06-13 14:00:00.000 
A+ 0.0461028 31.6310774 SSW2 21.422 37.853 2017-06-13 14:00:00.000 
A 0.0461028 32.2647927 S2 19.408 36.39 2017-06-13 15:00:00.000 
A 0.0461028 32.2647927 S2 21.422 36.39 2017-06-13 15:00:00.000 
A 0.0461028 32.2647927 S2 19.408 37.853 2017-06-13 15:00:00.000 

il should't faire comme ça, j'ai besoin de resualt comme ce que je l'ai dit pour chaque valeur de données heure de Temprature, pression, Percipitation, Ciel, ......

+0

IMO, Conception médiocre sans aucune normalisation. –

+0

@PrabhatG c'est parce qu'il fait une insertion en vrac d'un fichier txt dans 8 table (8 variables métrologiques) je ne sais pas pourquoi ils le conçoivent comme ça mais c'est ce que c'est une suggestion? –

+0

Essayez de créer un index sur ID_Geo. Cela réduira le temps d'exécution de la requête. – Debabrata

Répondre

0

Je pense que vous pouvez simplement rejoindre sur la géo et la date:

select t.*, ws.simboles 
from data_temperature t join 
    data_WeatherSimbol ws 
    on t.ID_geo = ws.ID_geo and t.date = ws.date; 
+0

le problème est que ce sera super lent –

+0

Pourquoi un 'join' serait-il" super lent "? –

+0

Je devine en raison de beaucoup de jointures n'est pas meilleur de faire une vue de ces tables? ou gérer avec un cluster d'index? –

0

Essayez cette

;With data_temprature(ID_geo,NAME,Value,[Date]) 
AS 
(
SELECT 10005 , 'Madrid' , 32 , '2017-06-12 08:00' Union all 
SELECT 10005 , 'Madrid' , 25 , '2017-06-12 09:00' Union all 
SELECT 12701 , 'Paris' , 23 , '2017-06-12 08:00' Union all 
SELECT 13006 , 'Tokyo' , 25 , '2017-06-12 11:00' Union all 
SELECT 11132 , 'Sevilla' , 27 , '2017-06-12 16:00' Union all 
SELECT 21333 , 'London' , 22 , '2017-06-12 17:00' 
) 
,data_WeatherSimbol(ID_geo,NAME,Value,[Date]) 
AS 
(
SELECT 10005 , 'Madrid' , 'A+' , '2017-06-12 08:00' Union all 
SELECT 10005 , 'Madrid' , 'A' , '2017-06-12 09:00' Union all 
SELECT 12701 , 'Paris' , 'A-' , '2017-06-12 08:00' Union all 
SELECT 13006 , 'Tokyo' , 'C-' , '2017-06-12 11:00' Union all 
SELECT 11132 , 'Sevilla' , 'I+' , '2017-06-12 16:00' Union all 
SELECT 21333 , 'London' , 'D-' , '2017-06-12 17:00' 
) 
SELECT ID_geo, 
     NAME, 
     Temperature, 
     Symboles, 
     [Date] From 
(
SELECT t.ID_geo , 
     t.NAME , 
     t.Value AS Temperature, 
     w.Value AS Symboles,t.[Date] , 
     ROW_NUMBER()OVER(PARTITION BY t.Value,t.[Date] ORDER BY t.[Date]) AS Rno 
FROM data_temprature t 
INNER join data_WeatherSimbol w 
On t.ID_geo=w.ID_geo 
)Dt 
WHERE Dt.Rno=1 
ORDER BY ID_geo 
0

ni [ID_geo] ni [Date] semble être assez unique pour rejoindre, donc:

  1. Créer un index sur les colonnes à la fois pour toutes les tables comme

    create index IX_data_temprature on data_temprature ([ID_geo], [Date])

  2. Joignez-vous à toutes les tables de [ID_geo], [Date]

0

La plupart de la charge de la requête est causée par le RID recherches.

Les recherches RID sont utilisées lorsque les index ne couvrent pas la requête (Sql doit rechercher les valeurs dans la table car elles ne sont pas incluses dans l'index) et l'index est non cluster.

Votre requête peut être plus rapide si vous avez utilisé des index couverts, vous n'avez probablement pas inclure de valeur dans votre index. Plus sur l'inclusion peut être trouvé dans Microsoft docs.

Il peut également être utile si vous modifiez votre index non cluster en un index clusterisé.