| 

.NET C# Java Javascript Exception

2
Hi zusammen,
ich hab eine etwas größere Abfrage die in etwa so aussieht:

DECLARE @ZielTabelle TABLE
(
CustomerId int
, CustomerName varchar(254)
, BestellungsId int
, BestellungsText varchar(254)
)

INSERT INTO @ZielTabelle
(
CustomerId
,CustomerName
,BestellungsId
,BestellungsText
)
SELECT CustomerId, CustomerName, BestellungsId, BestellungsText
FROM Customer
INNER JOIN Bestellungen ON Customer.CustomerId = Bestellungen.CustomerId

Kurioserweise dauert das befüllen des Feldes BestellungsText viel zu lang. Die Felder haben den gleichen Datentyp, gleiche Feldbreite. Ich habe bereits geprüft ob der SELECT ohne den INSERT auch so lang dauert, fehlanzeige.

Es handelt sich hier um ein vereinfachtes Beispiel, dass den Zusammenhang der Daten erklären soll, meine Abfrage weicht also etwas davon ab, hat aber insgesamt nur 13 Felder und nur einen weiteren INNER JOIN mehr, an dem es auch nicht liegt.

Danke!

edit:
auch eine Änderung von Tablevariable in eine Temp Table bringt keine verbesserung.
News:
08.04.2013
Sweatdiver 126 1 6
Mit MSSQL kenne ich mich nicht aus, aber vielleicht bewirkt das Auflösen des inner join in ein where eine Beschleunigung? Unter MySQL funktioniert das recht gut. SELECT * FROM Customer,Bestellungen WHERE Customer.CustomerId = Bestellungen.CustomerId
muffi 09.04.2013
@muffi
hatte ich schon versucht. Wie gesagt, das Problem ist nicht der Select, sondern der INSERT in die Tablevar. Der ganze Spass passiert in'ner TVF und ich hole die Daten nun am Ende per Subquery, was nach meinem Verständnis eigentlich noch länger dauern müsste... tuts aber nicht.

Es funktioniert nun zwar performant, ist aber schlecht zu lesen
Sweatdiver 09.04.2013
@muffi: Das ist der alte Inner-Join-Syntax (SQL-92 Standard).
@Sweatdiver: Das Problem hatte ich auch mal. Der Optimizer erzeugt andere Ausführungspläne sobald ein INSERT oder UPDATE mit einem SELECT kombiniert wird.
Floyd 09.04.2013
Liegt es bestimmt nur an der einen Spalte "Bestellungstext"? Mach das ganze dann mal nur für diese Spalte und lass dir den Ausführungsplan anzeigen.
mrmee 10.04.2013
Versuch mal das ganze etwas zu täuschen und ändere Testweise die BestellungsText auf varchar(2) und fülle es mit einem Fixen Wert:
INSERT INTO @ZielTabelle(CustomerId, CustomerName, BestellungsId, BestellungsText)
SELECT CustomerId, CustomerName, BestellungsId, 'B' AS BestellungsText
FROM Customer
INNER JOIN Bestellungen ON Customer.CustomerId = Bestellungen.CustomerId
Beobachter hierbei, was sich am Ausführungsplan ändert.
MStrasser 16.04.2013