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