TriggerMichNet 10 Geschrieben 17. April 2013 Melden Teilen Geschrieben 17. April 2013 (bearbeitet) 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 17. April 2013 von TriggerMichNet Zitieren Link zu diesem Kommentar
TriggerMichNet 10 Geschrieben 20. April 2013 Autor Melden Teilen Geschrieben 20. April 2013 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 Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 20. April 2013 Melden Teilen Geschrieben 20. April 2013 Probier es doch im Entwickler Forum von MSFT für den SQL Server: http://social.msdn.microsoft.com/Forums/de-DE/category/sqlserver Zitieren Link zu diesem Kommentar
wiri 10 Geschrieben 25. April 2013 Melden Teilen Geschrieben 25. April 2013 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 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.