Re: Sql-Server-Performance
- From: "Elmar Boye" <ElmarB@xxxxxxx>
- Date: Tue, 10 May 2005 17:13:27 +0200
Hallo Peter
Peter Piry <peter.piry@xxxxxxxxx> schrieb ...
Was ist denn da schiefgegangen? Ich habe mal neu formatiert...
> SELECT ISNULL(count(*),0)
COUNT(*) liefert keine NULL, sondern 0, wenn keine
Datensätze zutreffen, ist hier also ebenso überflüssig.
FROM ANTRAEGE,
ARBEITSVERHAELTNISSE
WHERE ANTRAEGE.ANTRAGSSTATUS_ID = 1
AND ANTRAEGE.ARBEITSVERHAELTNIS_ID = ARBEITSVERHAELTNISSE.ARBEITSVERHAELTNIS_ID
AND ANTRAEGE.GEST_ID_ARBEITSVERHAELTNIS = ARBEITSVERHAELTNISSE.GESCHAEFTSSTELLEN_ID
AND (ISNULL(ANTRAEGE.anzahl_bescheide, 0) > 0
OR exists ( SELECT 1
FROM SCHREIBEN,SCHREIBENBETROFFENE
WHERE SCHREIBENBETROFFENE.ANTRAG_ID = ANTRAEGE.ANTRAG_ID
AND SCHREIBENBETROFFENE.GEST_ID_ANTRAG = ANTRAEGE.GESCHAEFTSSTELLEN_ID
AND SCHREIBENBETROFFENE.SCHREIBEN_ID = SCHREIBEN.SCHREIBEN_ID
AND SCHREIBENBETROFFENE.GEST_ID_SCHREIBEN = SCHREIBEN.GESCHAEFTSSTELLEN_ID
AND SCHREIBEN.SCHREIBENTYP_ID IN (4, 31, 43) ))
AND ARBEITSVERHAELTNISSE.INSOLVENZ_ID = 2107
AND ARBEITSVERHAELTNISSE.GEST_ID_INSOLVENZ = 1
> Wenn man die Anweisung (ISNULL(antraege.anzahl_bescheide, 0) > 0 weglässt,
> dann sind die Daten sofort da, sonst benötigt die Abfrage die 52 Sekunden.
Wie bereits geschrieben, solltest Du die Abfragepläne mit und ohne
vergleichen. Und lass die überflüssigen ISNULL weg bzw. falls ihr da
einen SQL Builder verwendet, bringt ihm den Unterschied bei.
Wobei der wesentliche Aufwand durch die EXISTS Klausel resultiert.
Und der Optimierer hier eher durch die zusätzliche Bedingung irritiert
scheint und sich einen sehr ungünstigen Plan rausgreift.
Leider kann ich das von hier nicht vollständig beurteilen,
da zu wenig Informationen über die beteiligen Tabellen vorliegen.
> Das Seltsame dran ist, das wir 9 identische Server haben, wobei einer davon
> die Daten aller anderen 8 beinhaltet (mit Stand von gestern abend) - auf
> allen anderen Servern ist diese Abfrage sofort da, auch auf dem mit allen
> Daten, nur nicht einem der anderen 8 Server. Dies funktioniert angeblich
> seit einigen Tagen nicht mehr richtig. Die Inidzes auf den betroffenen
> Tabellen haben wir verglichen, diese sind mit den anderen Servern identisch.
> Ich schätze mal, das das Problem daher eher an der Datenbank als an der Query liegt,
Aktualisiere mal die Statistiken für die Tabellen und leere den
Prozedurcache anschliessend mit DBCC FREEPROCCACHE oder starte den
Server durch wenn möglich.
Gruss
Elmar
> Hi,
>
> die komplette Abfrage ist:
>
> SELECT ISNULL(count(*),0)
> FROM ANTRAEGE,ARBEITSVERHAELTNISSE
> WHERE ANTRAEGE.ANTRAGSSTATUS_ID=1 AND
> ANTRAEGE.ARBEITSVERHAELTNIS_ID=ARBEITSVERHAELTNISSE.ARBEITSVERHAELTNIS_ID
> AND
> ANTRAEGE.GEST_ID_ARBEITSVERHAELTNIS=ARBEITSVERHAELTNISSE.GESCHAEFTSSTELLEN_IDAND(ISNULL(ANTRAEGE.anzahl_bescheide,
> 0) > 0OR exists ( SELECT 1 FROM SCHREIBEN,SCHREIBENBETROFFENE WHERE
> SCHREIBENBETROFFENE.ANTRAG_ID=ANTRAEGE.ANTRAG_ID AND
> SCHREIBENBETROFFENE.GEST_ID_ANTRAG=ANTRAEGE.GESCHAEFTSSTELLEN_ID AND
> SCHREIBENBETROFFENE.SCHREIBEN_ID=SCHREIBEN.SCHREIBEN_ID AND
> SCHREIBENBETROFFENE.GEST_ID_SCHREIBEN=SCHREIBEN.GESCHAEFTSSTELLEN_ID
> AND SCHREIBEN.SCHREIBENTYP_ID IN (4, 31, 43) ))AND
> ARBEITSVERHAELTNISSE.INSOLVENZ_ID=2107AND
> ARBEITSVERHAELTNISSE.GEST_ID_INSOLVENZ=1Wenn man die Anweisung
> (ISNULL(antraege.anzahl_bescheide, 0) > 0 weglässt,dann sind die
> Daten sofort da, sonst benötigt die Abfrage die 52 Sekunden.Das
> Seltsame dran ist, das wir 9 identische Server haben, wobei einer
> davondie Daten aller anderen 8 beinhaltet (mit Stand von gestern
> abend) - aufallen anderen Servern ist diese Abfrage sofort da, auch
> auf dem mit allenDaten, nur nicht einem der anderen 8 Server. Dies
> funktioniert angeblichseit einigenTagen nicht mehr richtig. Die
> Inidzes auf den betroffenenTabellen haben wir verglichen, diese sind
> mit den anderen Servern identisch.Ich schätze mal, das das Problem
> daher eher an der Datenbank als an derQuery liegt, oder ?mfgPeter
> Piry"Elmar Boye" <ElmarB@xxxxxxx> wrote in
> messagenews:3ebhe6F27nk3U3@xxxxxxxxxxxxxxxxx> Hallo Peter,> Peter
> Piry <peter.piry@xxxxxxxxx> schrieb ...>>> wie meinst deinen letzten
> Absatz genau?>>>> Wenn Du den meinst:>>>> Bei >= 0 kann der der
> Optimierer von Treffern ausgehen, die>>> er bei > 0 nicht implizieren
> kann. Wieviel hängt davon ab,>>> wieviele Nullen sich in Deiner
> Tabelle rumtreiben. Und wos>>> der Optimierer weiss, wählt er einen
> anderen Abfrageplan.>>> Genaueres kann nur ein Vergleich der
> Abfragepläne zeigen.>> Lass Dir mal die Abfragepläne (STRG+K) im
> Query Analyzer> anzeigen.>>> Die Daten in der Spalte sehen ungefähr
> so aus:>>>> NULL - 138 Datensätze>> -31 - 52 Datensätze>> -30 - 13
> Datensätze>> -28 - 2 Datensätze>> -1 - 3 Datensätze>> 0 - 27492
> Datensätze>> bei den vielen "0"en dürfte bei >= 0 ein Table Scan>
> rauskommen, da fast alle Datenzeilen enthalten sind.>>> 1 - 4090
> Datensätze>> 2 - 889 Datensätze>> 3 - 128 Datensätze>> 4 - 17
> Datensätze>> 5 - 6 Datensätze>> 6 - 4 Datensätze>> 9 - 1 Datensätze>>
> 10 - 1 Datensätze>> das hier ist aber Pi * Daumen weit weniger als
> die Hälfte,> so dass ein Index verwendet könnte. Warums aber gleich
> 52> Sekunden werden, erklärt sich bei der Handvoll Datenzeilen>
> nicht.> Im gezeigten Plan wird>>>
> |--Filter(WHERE:([ANTRAEGE].[ANZAHL_BESCHEIDE]>0 OR [Expr1011]))>>
> offensichtlich nur gefilterz.>> Kommt bei der "schnellen" Abfrage
> ebenfalls ein Hash vor wie> beim gezeigten Plan:>>> | |--Hash
> Match(Inner Join, HASH:([Bmk1000])=([Bmk1000]),>>>
> RESIDUAL:([Bmk1000]=[Bmk1000]))>>> | |--Hash Match(Inner Join,
> HASH:([Bmk1000])=([Bmk1000]),>>> RESIDUAL:([Bmk1000]=[Bmk1000]))>
> und einige mehr...> Kandidat 2 wäre>>> | | |--Index
> Scan(OBJECT:([IESG].[dbo].[ANTRAEGE].[ANTR_AV_FK_I]))>>> |
> |--Index Scan(OBJECT:([IESG].[dbo].[ANTRAEGE].[IDX_ANZ_B]))>> wobei
> man wissen müsste was der Inhalt der Indizes ist.>> Neben dem Plan
> wäre die Abfrage in ihrer Gesamhteit selbst ganz nett.> Denn der
> Optimierer dreht da schon ziemlich heftig, so dass eine>
> Rückübersetzung mühsam ist.>> Gruss> Elmar>>>>
.
- Follow-Ups:
- Re: Sql-Server-Performance
- From: Peter Piry
- Re: Sql-Server-Performance
- References:
- Sql-Server-Performance
- From: Peter Piry
- Re: Sql-Server-Performance
- From: Elmar Boye
- Re: Sql-Server-Performance
- From: Peter Piry
- Re: Sql-Server-Performance
- From: Elmar Boye
- Re: Sql-Server-Performance
- From: Peter Piry
- Sql-Server-Performance
- Prev by Date: Re: [ODBC SQL Server Driver] [SQL Server]Login faied for user "sa"
- Next by Date: Mit Anfügeabfrage nur neue Datensätze übernehmen
- Previous by thread: Re: Sql-Server-Performance
- Next by thread: Re: Sql-Server-Performance
- Index(es):
Relevant Pages
|