Forums Neueste Beiträge
 

SELECT COUNT dauert sehr lange

20/08/2009 - 11:58 von Michael Andreas | Report spam
Hi,

ich möchte alle Zeile zàhlen, die nach einem
Termin bis heute eingefügt worden.
SELECT COUNT(*) FROM Table WHERE DATEDIFF(day, DateStart, GetDate()) = 5

das funktioniert gut ist aber sehr langsam.
Gibt es hierfür eine perfomantere Lösung?

Danke Michael
 

Lesen sie die antworten

#1 Christoph Ingenhaag
20/08/2009 - 13:57 | Warnen spam
Hallo Michael

"Michael Andreas" wrote:

Hi,

ich möchte alle Zeile zàhlen, die nach einem
Termin bis heute eingefügt worden.
SELECT COUNT(*) FROM Table WHERE DATEDIFF(day, DateStart, GetDate()) = 5

das funktioniert gut ist aber sehr langsam.
Gibt es hierfür eine perfomantere Lösung?

Danke Michael



1. Die Spalte DateStart muss indiziert sein
2. Der Wert des Ausdrucks in der WHERE Klausel muss für den Optimizer
bekannt sein. Nichtdeterministische und "komplexere" Berechnungen werden mit
einem Scan-Operator im Plan verarbeitet obwohl ein Seek-Operator verwendet
werden könnte.

Du musst den Wert also vorher berechnen und dann in der WHERE Klausel
verwenden.

Wenn die Daten ungleichmàßig verteilt sind verteilt sind, kann es hierbei
auch noch zum Problem kommen, dass der erstellte Plan nicht für jeden
übergebenen Parameter/Wert der beste ist, so dass man hier mit den Query
Hints OPTIMIZE FOR bzw. RECOMPILE arbeiten sollte (sonst tritt das Problem
"Mal schnell, mal langsam" auf.

Alternativ könntest du auch eine Indexed View erstellen, die für jeden Tag
alle Sàtze zàhlt. Dabei gibt es auch einige Fallstricke zu beachten. Es macht
Sinn, wenn die Anzahl der Datensàtze in der View durch die Aggregierung
signifikant geringer ist, als in der zugrunde liegenden Tabelle und kaum
Datensàtze beim Datum aktualisiert werden und keine grossen Mengen von
Datensàtze eingefügt werden.



So könnte es bsplw. gehen:

create view dbo.CountAdresse
with schemabinding
as

select
convert(varchar(10), DateStart, 102) DateStart
,count_big(*) Anzahl
from dbo.Adresse
group by
convert(varchar(10), DateStart, 102)

create unique clustered index cuiDateStart on dbo.CountDate(DateStart)

Zugriff mit
select Anzahl from dbo.CountAdresse with (noexpand) where DateStart = ...

Am besten mit der Echtdatenmenge testen :-)

Viele Grüße
Christoph

Ähnliche fragen