2017-10-17 4 views
1

J'ai une très grande table (plus de 140 mil de lignes et une taille d'environ 230 gb). Il y a une colonne, appelée "date_dim" avec un index clusterisé asc. Dans le tableau sont stockées toutes les données de 2015.Problème de performance - Sélectionnez firstdate par mois sur une très grande table

Ma cible est maintenant d'obtenir la première date d'un mois où les données sont stockées. Il se pourrait donc qu'en janvier les données aient commencé au 5ème. Je dois donc créer une requête "dynamique".

Pour récupérer ces données, j'ai créé requête suivante:

SELECT 
    * 
FROM (
    SELECT    
    date_dim 
    ,row_num = ROW_NUMBER() OVER (PARTITION BY MONTH(date_dim) ORDER BY date_dim ASC) 
    FROM myTable_2015 WITH (NOLOCK) 
) AS s 
WHERE 
    row_num = 1 
ORDER BY 
    1 

Maintenant, mon problème est que la requête a un temps très long pour obtenir les données. Y at-il peut-être une autre option pour créer une requête avec de meilleures performances? Avez-vous des conseils sur la performance pour sélectionner ces grandes tables pour mon cas spécifique?

En fait, je ne peux pas apporter des modifications sur la table elle-même, seul l'accès 'Lire' ...

+0

Cant vous obtenez juste de la table Date? – RegBes

+0

Non, parce que j'ai besoin de la première date à laquelle les données sont stockées par mois ... –

Répondre

1

Si je comprends bien votre question, deux options rapides

Select BOMonth = min(date_dim) 
From myTable_2015 
Group By year(date_dim),month(date_dim) 

Ou encore

Select BOMonth = min(date_dim) 
From (select distinct date_dim from myTable_2015) A 
Group By year(date_dim),month(date_dim) 
+0

Merci beaucoup pour votre avis - va le vérifier ... –

+0

La deuxième requête devrait être beaucoup plus rapide. – qxg

0

Utiliser une fonction de fenêtre:

SELECT distinct min([date_dim]) 
    over (partition by Year([date_dim]), month([date_dim])) as [FirstDate] 
FROM myTable_2015 
ORDER BY [date_dim] 
0

Si vous avez des lignes 140 mil alors bonne chance que vous avez le premier de chaque mois

select distinct(date_dim) 
from myTable_2015 WITH (NOLOCK) 
where day(date_dim) = 1 

Ou vous pouvez isoler le premier x

select min(date_dim) 
from myTable_2015 WITH (NOLOCK) 
where day(date_dim) <=5 
group by month(date_dim)