ich den Code unten haben ...Verbesserung der Leistung SP
UPDATE Sales
SET MappingOrderID = CAST ([dbo].[fRemoveNonNumericCharacters] (ltrim(rtrim(ActualOrderNumber))) AS INT)
FROM Sales
where isnumeric(ActualOrderNumber) = 1
and ActualOrderNumber not like '%.%'
and len(ActualOrderNumber) < 10
and MappingOrderID is null
and ActualOrderNumber is not null
and ltrim(rtrim(ActualOrderNumber)) in (select ltrim(rtrim(OrderID)) from dbo.Orders)
Die beteiligten Spalten sind:
aus dem Verkauf: MappingOrderId INT ActualOrderNumber NVARCHAR (10)
Von Aufträge: OrderId INT
Dies ist Legacy-Code, ich bin der DBA, ich weiß nicht, warum er/sie T verwendet so vielen Rand ... Das Skript dauert 9 Minuten zu laufen, und hat idealerweise häufig ausgeführt werden ...
ich dies auch im Ausführungsplan:
CONVERT_IMPLICIT (varchar (12), [Datamart] . [DBO]. [Orders]. [OrderID],
0)CONVERT_IMPLICIT (VARCHAR (20), [Datamart]. [DBO]. [Sales]. [ActualOrderNumber], 0)
Typkonvertierung in Ausdruck (CONVERT_IMPLICIT (varchar (20), [DataMart]. [Dbo]. [Verkauf]. [ActualOrderNumber], 0)) kann "CardinalityEstimate" in der Abfrageplanauswahl beeinflussen, Typkonvertierung in Ausdruck (CONVERT_IMPLICIT (varchar (12), [Datamart]. [dbo]. [Aufträge]. [OrderID], 0)) kann "CardinalityEstimate" im Abfrageplan beeinflussen Wahl
Für das, was ich fühle ...
Es Updates MappingOrderId (int) durch ActualOrderNumber (varchar) Gießen ... Es nur aktualisieren, wenn ActualOrderNumber in Aufträge existiert ...
Ich versuche ein paar Modifikationen; aber der varchar ActualOrderNumber hat Werte wie 3545427103, und wenn ich versuche, alles zu entfernen, wie:
and len(ActualOrderNumber) < 10
Es bricht ...
Mein Gesamtziel ist es, diesen Prozess zu machen die effizienteste möglich; stellt die Daten an der Quelle die einzig wahre Lösung dar?
Ich habe viele der Vorschläge implementiert und es ging bis zu einer Minute. Vielen Dank! Aber was ich nicht verstehe, ist dies:
Bevor mit dem hässlichen Code, den ich hatte:
Jetzt habe ich mehr liest ... und es dauert Sekunden zu laufen ... wie ist das möglich?
LIKE ist auch sehr teuer. Es gibt sicherlich Möglichkeiten, diese Abfrage zu verbessern, wenn Sie die Logik kennen. Ist das ein Scheck für einen Dollar-Wert im Bestellnummernfeld? Das könnte in CONTAINS geändert werden. Was ist los, wenn nur die Bestellnummern mit einer Länge von weniger als 10 zurückgegeben werden? –
Wenn Sie die Gelegenheit haben, fügen Sie beiden Tabellen eine Spalte hinzu, die die gesäuberte Bestellnummer enthält, füllen Sie sie auf und indizieren Sie sie. Die Gesamtzeit kann mindestens neun Minuten betragen. Sie können auch einen Vorteil sehen, wenn Sie das letzte 'IN' in ein' exist' ändern, aber den Abfrageplan zwischen den Änderungen überprüfen. –
Oh, und Sie haben auch eine UDF dort, die Dinge verlangsamen könnte. Der Abfrageplan sollte Ihnen eine Idee geben. Um herauszufinden, ob das CardinalityEstimate tatsächlich betroffen ist, vergleichen Sie tatsächliche und geschätzte Pläne und sehen, ob sich die Anzahl der Zeilen in der gleichen Umgebung befindet. –