Leistung von Inline-TVF im Vergleich zu Ansichten


9

Ich habe eine Datenbank, in der ich Inline-TVFs (Tabellenwertfunktionen) anstelle von Ansichten verwende. Zum Beispiel könnte ich zwei Tabellen mit den Namen [Automodell] und [Autohersteller] haben, die ich innerhalb der TVF [fnCarBrands] zusammenstelle.

Diese TVFs werden dann von anderen TVFs aufgerufen, um die weitere Verarbeitung und Berichterstattung durchzuführen. Also könnte ich meine Funktion [fnCarBrands] nehmen und mich der Tabelle [Kaufjahr] anschließen, um eine Funktion [fnCarBrandHistory] zu bilden. Und so weiter für mehrere Schichten von TVFs.

Ich könnte wahrscheinlich die gleiche Funktionalität mit Ansichten erhalten, da meine Inline-TVFs wirklich nur Verknüpfungen von Tabellen und anderen TVFs sind.

Wie ist die Leistung von auf diese Weise geschriebenen Inline-TVFs mit Ansichten zu vergleichen?


Höchstwahrscheinlich würden Sie dieselben Ausführungspläne und dieselbe Leistung sehen.
AK

Das habe ich mir gedacht, aber mir wurde gesagt, dass sich die TVF wie eine Klammer in der Algebra verhält - sie zwingt die DB-Engine, diese Abfrage zuerst abzuschließen, bevor sie optimiert. Die Verwendung von Ansichten ermöglicht es dem Optimierer, die gesamte Abfrage als Einheit zu optimieren.
FistOfFury

Eine Art Randnotiz, aber eine Idee, warum TVFs anstelle von Ansichten verwendet wurden? Nur Code-Monkey vs Data-Monkey Ansatz für das Problem?
Mark Storey-Smith

@ MarkStorey-Smith ja, der Grund ist, wie Sie sagen, Code-Monkey vs Data-Monkey-Ansatz.
FistOfFury

Antworten:


12

Das Abfrageoptimierungsprogramm behandelt eine Inline-Tabellenwertfunktion genau wie eine Ansicht:

CREATE FUNCTION dbo.InlineUdf(@arg1 int)
RETURNS TABLE
AS
RETURN 
(
    ... your query here ...
);

Eine Tabellenwertfunktion mit mehreren Anweisungen wird eher wie eine gespeicherte Prozedur ausgeführt. Sie müssen normalerweise mehrmals ausgeführt werden, anstatt in die Hauptabfrage gefaltet zu werden:

CREATE FUNCTION dbo.MultiStatementUdf (@col1 int)
RETURNS @result TABLE 
(
    id int primary key NOT NULL,
    ... 
)
AS
BEGIN
   DECLARE @var1 int
   set @var1 = 42

   INSERT @result
   SELECT ...
   RETURN
END;

1
@Andomar Mein Verständnis ist, dass TVFs mit mehreren Anweisungen wie eine Blackbox ausgeführt werden. Die Engine weiß nicht, was darin enthalten ist, und kann die Abfrage nicht optimieren. Haben Sie Artikel, auf die Sie verweisen können und die besagen, dass Ansichten und Inline-TVFs gleichwertig sind?
FistOfFury

4

Sie müssen ähnliche Ansichten wie die Funktionen erstellen und jeweils einen Blick auf den Ausführungsplan werfen, um zu sehen, was mit den einzelnen Funktionen los ist.


Genau. Benchmarking, selbst sehen - das ist der einzig verlässliche Weg zu lernen.
AK

@mrdenny Gibt es keine Möglichkeit vorherzusagen, wie der Optimierer die einzelnen Abfragetypen behandeln wird? Sicher gibt es einige Regeln, denen es folgt.
FistOfFury

2
@FistOfFury Ja, es gibt Regeln, Tausende und Abertausende, die mit Hunderten von Entwicklerjahren heuristischen Codes ergänzt werden. Aus diesem Grund müssen Sie testen oder Microsoft nach dem Quellcode des Optimierers fragen.
Mark Storey-Smith

Wenn Sie besser verstehen möchten, wie das Datenbankmodul festlegt, was zu tun ist, müssen Sie sich über SQL Server Internals unter amazon.com/s/…
HLGEM vom

3

Das Erstellen von Ansichten, die andere Ansichten aufrufen, ist natürlich auch ein Leistungskiller. Gehen Sie diesen Weg nicht. Schreiben Sie die Abfragen, die Sie benötigen, und verwenden Sie weder TVFs noch Ansichten, wenn Sie Leistung wünschen. Es ist die Schichtung , die das Problem verursacht. Dies ist fast immer eine schlechte Sache, wenn Sie eine Datenbank abfragen, und Sie können schnell die Grenze der Anzahl der Tabellen erreichen, auf die Sie auch verweisen können, zumal Sie häufig auf die verweisen gleiche Tabellen in verschiedenen Schichten. Dies scheint zwar einfacher zu warten zu sein, ist es aber nicht. Versuchen Sie, eine Spalte aufgrund einer neuen Anforderung zu debuggen oder hinzuzufügen, wenn sich die zu reparierende Ebene unten befindet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.