Ich versuche, den besten Ansatz (schnellste!) Für eine gespeicherte Prozedur zu ermitteln, die ich erstelle. Es ist eine ziemlich grundlegende gespeicherte Prozedur, die verwendet wird, um Felder zwischen zwei Systemen auf Datenintegrität zu vergleichen. Zuerst habe ich über die Verwendung von temporären Tabellen und das Hinzufügen von Indizes nachgedacht, aber ich habe keinen Geschwindigkeitsunterschied gesehen. Als ich dann über Leistungssteigerungen durch Tabellenwerte-Funktionen las, dachte ich, dass dies ein Weg wäre, aber einige einfache Tests zeigen keine Verbesserungen. Der Grund, warum ich sogar daran interessiert war, meine Abfrage zu optimieren, liegt darin, dass die Where-Bedingung viele Skalarfunktionen verwendet, weil Feldlängen zwischen den Systemen nicht übereinstimmen (ein ganz anderes Problem). Daher nahm ich an, dass viele skalare Funktionen innerhalb einer Where-Klausel schlecht wären Performance.Verwendung wo Bedingung mit skalaren Funktionen vs wo Bedingung mit Kreuz anwenden & Tabelle Funktion
Hier Ansatz # 1:
SELECT
SLXID
FROM dbo.Salesforce_Contacts a WITH(NOLOCK)
JOIN _SLX_Contact b WITH(NOLOCK)
ON a.SLXID = b.Contactid
WHERE
a.IsDeleted = 0
AND
(
LEFT(a.FirstName, 32) != b.FirstName
AND LEFT(a.LastName, 32) != b.LastName
AND LEFT(a.Title, 64) != b.Title
AND dbo.GetSLXContactStatus(a.Contact_Status__c) != b.Status
)
Und hier ist Ansatz # 2 Tabelle bewertet Funktion:
SELECT
a.SLXID
FROM dbo.Salesforce_Contacts a WITH(NOLOCK)
JOIN _SLX_Contact b WITH(NOLOCK)
ON a.SLXID = b.Contactid
CROSS APPLY
dbo._SFContact_Functions_TEMP(a.FirstName, a.LastName, a.Title, a.Contact_Status__c) CA
WHERE
a.IsDeleted = 0
AND
(
b.FirstName != CA.FirstName_32
AND b.LastName != CA.LastName_32 -- etc.
AND b.Title != CA.Title_64
AND b.Status != CA.Contact_Status
)
Hier ist die Tabellenwertfunktion in # 2:
ALTER FUNCTION dbo._SFContact_Functions_TEMP
(
@FirstName VARCHAR(40)
,@LastName VARCHAR(80)
,@Title VARCHAR(128)
,@Status VARCHAR(20)
)
RETURNS TABLE
AS
RETURN
SELECT
LEFT(@FirstName, 32) FirstName_32
,LEFT(@LastName, 32) LastName_32
,LEFT(@Title, 64) Title_64
,dbo.GetSLXContactStatus(@Status) Contact_Status
GO
Und schließlich sind hier die Ausführungspläne (tatsächlich):
Für # 1 Für # 2 Jede Hilfe oder Beratung ist sehr willkommen!
Ich bevorzuge die Version ohne die benutzerdefinierte Funktion; es scheint einfach zu sein. Aber was ist deine Frage? –
@GordonLinoff Ich bin am wahrscheinlichsten OCD. Die Abfrage dauert 20-40 Sekunden, um zu beenden, was ungewöhnlich lang ist (relativ), also möchte ich es beschleunigen. Vielleicht sind die linken Funktionen usw. und die Zeit, die es braucht, einfach unvermeidbar? – tchock