2016-05-06 7 views
0

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 #1 Für # 2 #2 Jede Hilfe oder Beratung ist sehr willkommen!

+0

Ich bevorzuge die Version ohne die benutzerdefinierte Funktion; es scheint einfach zu sein. Aber was ist deine Frage? –

+0

@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

Antwort

0

1. Ansatz ist besser.

An erster Stelle, was Sie versuchen zu tun? Datenbank-Design scheint falsch zu sein.

ist diese einmalige Abfrage oder dauerhaft.

Angenommen, dass, was Sie versuchen zu tun ist richtig, dann 20-40 Sekunden ist viel weniger Zeit.

Zeigen Sie auch, was in dbo.GetSLXContactStatus (a.Contact_Status__c) ist.

einmal könnte so versuchen sein,

tABLE dbo.Salesforce_Contacts 
cLUSTERED INDEX ON SLXID 
Create non clusterindex on IsDeleted AND INCLUDE COLUMN(FirstName,LastName,Title) 

tABLE dbo._SLX_Contact 
cLUSTERED INDEX ON Contactid 

;With CTE 
(
SELECT SLXID ,LEFT(a.FirstName, 32) FirstName, LEFT(a.LastName, 32) LastName 
, LEFT(a.Title, 64) Title 
FROM dbo.Salesforce_Contacts a WITH(NOLOCK) 

WHERE 
a.IsDeleted = 0 

) 

select * from CTE 
JOIN _SLX_Contact b WITH(NOLOCK) 
    ON a.SLXID = b.Contactid 
WHERE 
a.FirstName=! b.FirstName 
AND (a.LastName != b.LastName 
AND a.Title != b.Title 
AND dbo.GetSLXContactStatus(a.Contact_Status__c) != b.Status-- EXPLAIN THIS 
) 

WENN SIE VIEL RECORDS HABEN DÜRFEN SIE CTE RECORD IN TEMP TABELLE MIT RICHTIGEN INDEX

0

Aus dem Bild einfügen können vorausgesetzt, es gibt wenig oder gar keine Unterschied in der Leistung und automatisch optimierte Pläne # 1 und # 2. SSMS weist Sie auf einen zusätzlichen Index hin. Analysiere # 1 und # 2, wenn sie anders sind (kaum möglich). Versuchen Sie, die angebotenen Indizes hinzuzufügen. Analysieren Sie, was genau von den Plänen verwendet wird.

Verwandte Themen