2010-09-11 2 views
5

In einer meiner Abfragen gibt es eine insert von Daten in eine temporäre Tabelle. Wenn Sie den Abfrageplan betrachten, wird angezeigt, dass die tatsächliche Einfügung in die temporäre Tabelle 54% dauerte (indem Sie nur Daten in die temporäre Tabelle einfügen). Es werden jedoch keine Zeilen in die temporäre Tabelle eingefügt.Abfrageplan zeigt Kosten von 54% für eine Einfügung, wenn keine Zeilen tatsächlich beteiligt sind

Warum zeigt der Plan einen Wert ungleich null, wenn keine Zeilen eingefügt werden?

+0

Können Sie einen Screenshot und/oder die SQL-Anweisung anzeigen? –

Antwort

2

Auch in der tatsächlichen Abfrageplan die Unterstruktur Kosten dargestellt sind basieren auf Schätzungen sowie various heuristics and magic numbers used by the cost based optimiser. Sie können woefully wrong sein und sollten mit einer großen Prise Salz eingenommen werden.

Beispiel

create table #t 
(
i int 
) 

insert into #t 
select number 
from master.dbo.spt_values 
where number = 99999999 

Plan

Der tatsächliche Einsatz war null Zeilen, aber die Schätzung betrug 1 Zeile zu reproduzieren, die ist, wo die Unterstruktur Kosten kommt.

Edit: Ich habe gerade versucht, die folgende

insert into #t 
select top 0 number 
from master.dbo.spt_values 
where number = 99999999 

Plan

Auch wenn es die geschätzte Anzahl von Zeilen bekommt Recht, es noch eine kleine Nicht-Null-Kosten für den Einsatz zuweist. Ich denke, die Heuristik, die es verwendet, weist immer ein kleines Element von Fixkosten zu.

0

Die Kosten von 54 bedeutet nicht, dass Zeilen beteiligt sein müssen. Vielleicht gab es eine Indexsuche oder eine andere Suchoperation oder vielleicht eine nicht optimale Suche in der WHERE-Klausel dieses INSERT in die temporäre Tabelle?

2

werfen Sie einen Blick auf diese

insert into #temp 
select * from sometable 
where left(Somecol,3) = 'BLA' 

, die nicht sargable ist so wird es einen Scan verursachen, aber wenn keine Zeilen, den Einsatz zu finden sind nicht geschieht ... noch der Scan geschieht

aber wenn man das getan hat, dann sollten die Kosten drastisch sinken, denn jetzt kann der Index

insert into #temp 
select * from sometable 
where Somecol like 'BLA%' 

BTW verwenden würde ich verwendet werden STATISTICS TIME und STATISTICS IO stattdessen, um Leistung zu messen, diese beiden sind viel bessere Indikatoren .. wenn Sie 3 liest vs 10000 liest Sie wissen, was passiert .. was 45% sagen Ihnen genau, wenn der gesamte Prozess 3 Minuten oder 3 Sekunden laufen könnte

Verwandte Themen