Warum setzen einer WHERE-Klausel Blick von außen haben schreckliche Leistung

Lassen Sie uns sagen, Sie haben einen Blick:

CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
    a.date,
    a.Col1,
    b.Col2,
    DENSE_RANK() 
      OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date

Habe ich gefunden, dass die Leistung:

SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'

ist viel schlimmer, als

SELECT *, 
   DENSE_RANK() 
     OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'

Ich bin sehr überrascht, dass der Abfrageplan für diese beiden Aussagen sind nicht gleich.

Habe ich auch versucht, mit Hilfe einer inline-Tabellenwertfunktion, aber die Abfrage dauert noch 100-1000 mal länger als der code, wo ich kopieren und fügen Sie den view-Logik.

Irgendwelche Ideen?

  • Naja was die query-Pläne Aussehen? Fehlt ein index? Ist der Ansicht, Rücksendung zu viele Zeilen? Wenn die where-Klausel wird angewendet an der falschen Stelle?
  • Sieht dein Blick zufällig den Aufruf einer Ansicht?
  • Was passiert, wenn Ihre Ansicht nicht enthalten, eine windowing-Funktion? Was ist das erwartete semantische Ergebnis einer VIEW berechnet, dass Rang über den gesamten Satz, sondern eine Abfrage auf die view fügt eine neue Bedingung-sollte der RANG insde angewendet werden, bevor oder nachdem die Bedingung außerhalb?
InformationsquelleAutor bpeikes | 2011-07-11
Schreibe einen Kommentar