2017-10-20 3 views
0

ich eine SQL-Abfrage habe, die auf einer Parameterprüfung eine wirklich lange Zeit basierte unter ....SQL Query dauert lange Zeit mit Parameterprüfung

Die Abfrage selbst ist Teil einer gespeicherten Prozedur für eine Suche verwendet Bildschirm. Im Grunde füllen Sie ein Formular mit einer Menge Text-/Kombinationsfelder aus, aus denen Sie suchen können. Ich habe Mehrfachauswahl-Kombinationsfelder, die mehrere Werte für das gleiche Feld in Form eines abgegrenzten Felds durchlaufen.

Das Folgende ist eine abgespeckte Version der Abfrage mein Problem zu veranschaulichen ...

select 
    o.id, 
    o.createdBy 
into 
    #results 
from 
    jmsTransOther o 
where 
    o.(WorkOrderId IN (SELECT intValue FROM dbo.fn_SplitInts(@WorkOrderIds, ',')) <strong>OR @WorkOrderIds = ''</strong>) 

ich ziemlich oft verwenden diese Parameterprüfung OR @WorkOrderIds = '' was im Grunde bedeutet, wenn diese dann nicht wahr ist die andere Seite durchführen die Aussage.

Das ist ganz gut in den meisten Fällen funktioniert, aber aus irgendeinem Grunde mit dieser fn_SplitInts Funktion, die die getrennten Liste in eine Tabelle im Grunde konvertiert und dann eine wirklich lange Zeit nimmt eine „IN“ Anweisung ausführen.

Diese Tabelle enthält etwa 200.000 Datensätze - derzeit dauert das Suchen in etwa 40 Sekunden. Wenn ich jedoch die Parameterüberprüfung z. B. OR @WorkOrderIds = '' entferne, dauert es weniger als eine Sekunde.

Ich kann es umgehen, wollte aber nur wissen, was hier los ist ....?

+0

Dies ist fast definitiv ein Parameter-Sniffing-Problem. Die kurze Lösung besteht darin, einfach "WITH RECOMPILE" zu Ihrer gespeicherten Prozedur hinzuzufügen. Ich schlage vor, Sie tun einige Forschung über Parameter Schnüffeln im Allgemeinen obwohl, nur damit Sie verstehen, was los ist –

+0

@ Nick.McDermaid ok dachte nicht daran. Ich habe dieses Problem schon einmal gehabt. Allerdings bekomme ich das gleiche Problem, wenn ich die Abfrage in einem isolierten Abfragefenster einfach nur teste? Ist dies jetzt von einem Parameter-Sniffing-Problem ausgeschlossen? –

+0

Nein. Jede Client-Anwendung (SSMS oder eine Web-App) kann Parameter Sniffing –

Antwort

0

Ich könnte diese Formulierung vorschlagen:

select o.id, o.createdBy 
into #results 
from jmsTransOther o 
where o.WorkOrderId IN (SELECT intValue FROM dbo.fn_SplitInts(@WorkOrderIds, ',')) 
union all 
select o.id, o.createdBy 
from jmsTransOther o 
where @WorkOrderIds = ''; 

Die or wahrscheinlich die Statistik vermasselt wird. (Ich würde auch NULL anstelle der leeren Zeichenfolge verwenden, um "alle von ihnen" zu bedeuten.)

+0

Leider habe ich etwa 6 dieser gleichen Parameter prüft für verschiedene Kriterien in der where-Bedingung, die diese Lösung würde ziemlich unordentlich ... –

+0

@GlenHong bedeuten würde. . . Es ist nur möglich, die Frage zu beantworten, die Sie stellen. Wenn Sie eine andere Frage haben, fragen Sie sie als * neue * Frage. Wenn Sie diese Frage bearbeiten, wird nur der Server diese Antwort für ungültig erklären. –

+0

Nun, es gibt eine Frage in der letzten Zeile ... Ich habe nicht wirklich so viel nach einer Lösung gesucht, wie ich es umgehen kann. Ich war eher auf der Suche nach etwas, was das Problem verursacht hat ... wie Nick Mermaid darauf hingewiesen hat, was er denkt, ist das Problem –