Jump to content

Unterabfrage hat keinen Einfluss auf die Optimierungsmaßnahmen bzw.Indexauswahl


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hi

ich habe mal ne Verständnisfrage:

 

bei Unterabfragen behauptet Microsoft:

 

Als Prädikat muss EXISTS nicht das Resultset der Unterabfrage zurückgeben, sondern nur true oder false, je nachdem, ob die Unterabfrage irgendwelche Zeilen liefert oder nicht.

Daher  ignoriert der Abfrageoptimierer von SQL Server die SELECT-Liste der Unterabfrage. Was angeben wurde, hat keinen Einfluss auf die Optimierungsmaßnahmen, z.B. die Indexauswahl.

 

SELECT custid, companyname
 FROM Sales.Customers AS C
WHERE EXISTS
(SELECT *
   FROM Sales.Orders AS O
   WHERE O.custid = C.custid
   AND O.orderdate = '20070212'
);

!! Ist das so? !! Soll heißen, dass die Unterabfragen nie den Index verwenden werden?

 

Wenn dass so sein soll, dann wird hier ein Performanz Problem entstehen.

 

Falls ich das richtig verstanden habe, dann kann ich so was schreiben:

 

SELECT custid, companyname
  FROM Sales.Customers AS C
  WHERE EXISTS
(SELECT *
  FROM Sales.Orders AS O
  WHERE O.custid = C.custid
  AND YEAR(O.orderdate) = 2007 and MONTH(O.orderdate)= 2);

Da die gefilterte Spalte bearbeitet wurde, ist das Prädikat kein Suchargument, sodass SQL Server die Indexreihenfolge nicht nutzen kann, da er es eh nicht nutzen wird.

 

Oder verstehe ich das noch nicht richtig?

 

freue mich auf Rückmeldungen;-)

 

Viele Grüsse

Frank

bearbeitet von TriggerMichNet
Link zu diesem Kommentar

Ok ok, da hier keiner diesen Eintrag bisher gesichtete hat, somit auch keine Antworten / Hinweise kommen, gehe ich letztendlich davon aus,

meine Fragestellung keinen hier im Board anspricht.

Ok, dann werde ich diese Frage direkt an die MS-Spezialisten stellen.

 

Dennoch danke, falls doch jemand diesen Eintrag ließt.

Wenn ich mehr erfahren habe, werde ich das dann hier natürlich Posten.

 

Bis dann

VG

Frank

Link zu diesem Kommentar

Hi

-markiere die Abfrage SELECT custid, companyname FROM Sales.Customers AS C WHERE EXISTS (SELECT 1 FROM Sales.Orders AS O WHERE O.custid = C.custid AND YEAR(O.orderdate) = 2007 and MONTH(O.orderdate)= 2);

und drücle strg L , damit siehst du den Plan.

-Indexe werden schon benutzt im Optimizer.

-Performanceprobleme entstehen bei fehlenden bis unzureichenden Indexen.

-bei exist kannst die auch anstatt dessen direkt einen JOIN nehmen

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...