Re: Sql-Server-Performance

Tech-Archive recommends: Fix windows errors by optimizing your registry





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>>>>

.



Relevant Pages

  • =?ISO-8859-1?Q?SQL=2DQuery=2C_Guids_und_ein_klassischer_H=E4=3F=2DEffekt?=
    ... Replikations-IDs) und erlebe bei einer doch recht simplen Abfrage ... WHERE T1.GuidB='' AND T2.GuidB='' ... Lasse ich diese Query laufen, so erhalte ich definitiv ein Ergebnis, ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Re: Eine Liste aller Tabellen einer Datenbank
    ... Allerdings finde ich bei SQL 2000 keine Abfrage die mir das ... AND t.TABLE_SCHEMA = c.TABLE_SCHEMA ... WHERE t.TABLE_TYPE = 'BASE TABLE' ...
    (microsoft.public.de.sqlserver)
  • Re: Eine Liste aller Tabellen einer Datenbank
    ... Allerdings finde ich bei SQL 2000 keine Abfrage die mir das ... AND t.TABLE_SCHEMA = c.TABLE_SCHEMA ... WHERE t.TABLE_TYPE = 'BASE TABLE' ...
    (microsoft.public.de.sqlserver)
  • =?iso-8859-1?Q?Re:_Zwei_Parameter=2C_m=F6glich=3F?=
    ... Ich habe halt dem WHERE noch ein ... die Abfrage wird nicht ausgeführt. ... Verknüpfe die WHERE klausel mit AND bzw. OR ... Access FAQ: http://www.donkarl.com ...
    (microsoft.public.de.access)
  • Re: Performance
    ... am Server ein MSSqlSrv2000SP4 ... FROM server.BDE.dbo.TblPLN_ST_Artikel ts)bde ... AND bde.PLJahr=art.PLJahr ... WHERE art.PLKATG!=bde.PLKATG ...
    (microsoft.public.de.sqlserver)