Eintritt gegen Ansichten, die in SQLServer mit seltsamen query optimizer-Verhalten

Ich habe einen komplexen Blick, den ich verwenden, ziehen Sie eine Liste der Primärschlüssel, die angeben, dass die Zeilen in einer Tabelle, die geändert wurden zwischen zwei zeitlichen Punkte.

Diese Ansicht hat zur Abfrage 13 verknüpften Tabellen und schau dir den changelog-Tabelle, um zu ermitteln, ob eine Entität ist "schmutzig" oder nicht.

Selbst mit all diesen Los, dabei eine einfache Abfrage:

select * from vwDirtyEntities;

Dauert nur 2 Sekunden.

Allerdings, wenn ich es ändern zu

select
    e.Name
from 
    Entities e 
         inner join vwDirtyEntities de
             on e.Entity_ID = de.Entity_ID

Diese dauert 1,5 Minuten.

Jedoch, wenn ich dies tun:

declare @dirtyEntities table
(
    Entity_id uniqueidentifier;
)

insert into @dirtyEntities 
   select * from vwDirtyEntities;


select
   e.Name
from 
    Entities e 
        inner join @dirtyEntities de
           on e.Entity_ID = de.Entity_ID

Bekomme ich die gleiche Ergebnisse in nur 2 Sekunden.

Dies führt mich zu glauben, dass der SQLServer ist die Bewertung der anzeigen pro Zeile, wenn er kam, um Entitäten, anstatt die Erstellung einer Abfrage-plan, der beinhaltet die Teilnahme an der gemeinsamen inner join über die anderen Verknüpfungen in der Ansicht.

Beachten Sie, dass ich beitreten wollen, gegen die gesamte ResultSet von dieser Ansicht, als es filtert nur die Tasten, ich will intern.

Ich weiß, ich könnte es in einer materialisierten Sicht, aber das würde bedeuten, schema-Bindung, die Aussicht und die Abhängigkeiten und ich weiß nicht, wie die overhead-Pflege des index bewirken würde (Diese Ansicht wird nur abgefragt, für die Exporte, während es gibt weit mehr schreibt, um den zugrunde liegenden Tabellen).

So, abgesehen von einer table-variable zum Zwischenspeichern der Ergebnisse anzeigen, gibt es eine Möglichkeit zu sagen, die SQL Server-cache, um die Ansicht während der Auswertung der join? Ich habe versucht eine änderung der join-Reihenfolge (aus der Ansicht Auswählen und die Verknüpfung mit Entitäten), aber das machte keinen Unterschied.

Die Ansicht selbst ist auch sehr effizient, und es gibt keinen Raum zur Optimierung gibt.

InformationsquelleAutor FlySwat | 2010-09-29
Schreibe einen Kommentar