2017-10-17 1 views
1

Ich habe einen sehr großen Tisch (über 140 mil Reihen und Größe von rund 230 GB). Es gibt eine Spalte namens "date_dim" mit einem Clustered Index asc. In der Tabelle sind alle Daten von 2015 gespeichert.Performance Issue - Wählen Sie das erste Datum pro Monat auf einem sehr großen Tisch

Mein Ziel ist es jetzt, das erste Datum eines Monats zu erhalten, dass Daten gespeichert werden. So könnte es sein, dass im Januar die Daten am 5. gestartet sind. Also muss ich eine dynamische Abfrage erstellen.

diese Daten abzurufen, ich folgende Abfrage erstellt:

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 

Jetzt ist mein Problem ist, dass die Abfrage eine sehr lange Zeit, um die Daten zu erhalten hat. Gibt es möglicherweise eine andere Möglichkeit, eine Abfrage mit besserer Leistung zu erstellen? Haben Sie eine Leistungsempfehlung, um solche großen Tische für meinen speziellen Fall auszuwählen?

Eigentlich kann ich keine Änderungen auf dem Tisch selbst machen, nur 'Read' Zugang ...

+0

Cant Sie es nur ab dem Datum Tisch bekommen? – RegBes

+0

Nein, weil ich das erste Datum brauche, dass Daten pro Monat gespeichert werden ... –

Antwort

1

Wenn ich verstehe Ihre Frage, zwei schnelle Möglichkeiten

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

Oder sogar

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

Vielen Dank für Ihre Beratung - Überprüfen Sie es ... –

+0

Die zweite Abfrage sollte viel schneller sein. – qxg

0

Verwenden Sie eine Fensterfunktion:

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

Wenn Sie 140 mil Reihen haben dann eine gute Chance haben Sie die ersten eines jeden Monats

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

Oder Sie könnten auf dem ersten x isolieren

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