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!

Recommended Posts

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

Edited by TriggerMichNet
Link to comment

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

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 to comment
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...