Würden Sie dieses einfache SQL zur Nachbearbeitung senden?

8

Wir haben eine Web-Anwendung, in der die Benutzer Ad-hoc-Abfragen basierend auf Parametern ausführen, die eingegeben wurden. Ich könnte auch erwähnen, dass die Reaktionszeit für die Benutzer von großer Bedeutung ist.

Die Webseite erstellt dynamisch eine SQL, die basierend auf den eingegebenen Parametern ausgeführt wird. Wenn der Benutzer beispielsweise "1" für "Business Unit" eingibt, erstellen wir eine SQL wie folgt:

%Vor%

Ich habe festgestellt, dass, wenn der Benutzer keine BUSINESS_UNIT angibt, die folgende Abfrage erstellt wird

%Vor%

IMHO, das ist unnötigerweise (wenn nicht grob) ineffizient und rechtfertigt das Senden des Codes schlecht für die Änderung, aber da ich eine viel höhere Rate Code zurück zur Nachbearbeitung als andere habe, glaube ich, dass ich einen Ruf als verdienen kann "Zu wählerisch."

Wenn das eine unpassende Frage ist, weil es keine direkte Kodierung Q ist, lass es mich wissen und ich werde es sofort löschen. Ich bin sehr verwirrt, ob subjektive Fragen wie diese erlaubt sind oder nicht! Ich werde deine Antworten beobachten.

ty

Aktualisierung:

Ich verwende eine Oracle-Datenbank.

Mein Eindruck ist, dass Oracle "LIKE '%'" nicht optimiert, indem die Bedingung entfernt wird und dass es weniger effizient ist. Könnte jemand bestätigen?

    
ChadD 11.01.2010, 23:09
quelle

7 Antworten

9

Obwohl das grob ineffizient aussieht, habe ich es gerade in SQL Server getestet, und der Abfrageoptimierer war schlau genug, um ihn herauszufiltern.

Mit anderen Worten

%Vor%

und

%Vor%

hat genau den gleichen Abfrageplan erstellt. Es sollte also keinen Leistungsunterschied geben (abhängig von Ihrer DB-Engine, denke ich), obwohl es irgendwie schlampig aussieht.

Das kann Ihre Entscheidung beeinflussen, es zurückzusenden oder nicht. Persönlich würde ich wahrscheinlich, aber wenn Sie bereits unter einer Wolke sind, dann ist es etwas, auf dem Sie wahrscheinlich entspannen können, zumindest in Bezug auf die Leistung.

    
womp 11.01.2010, 23:15
quelle
14

Die beiden Abfragen sind völlig verschieden (aus der Sicht einer Ergebnismenge)

%Vor%

und

%Vor%

Der erste gibt alle Zeilen zurück, der zweite, wenn es NULL -Werte gibt, werden diese Zeilen nicht zurückgegeben, da irgendetwas im Vergleich zu NULL NULL ist und daher das Prädikat nicht erfüllt. So würde es in Oracle funktionieren.

    
Stellios 12.01.2010 00:37
quelle
2

Diese Abfrage mit dem BUSINESS_UNIT LIKE '%' sieht nicht ganz effizient aus - ich denke, es wird einen vollständigen Scan der Tabelle erzwingen ...

Also, ja, ich würde versuchen, diese Frage zu überarbeiten, um mit dieser Art von Situation richtig umzugehen - oder zumindest würde ich dieses Problem durch unseren Bug-Tracker melden > (Ich bin mir nicht sicher, welche Priorität ich zuweisen würde, aber trotzdem würde das Problem irgendwo protokolliert werden und jemand wird es irgendwann korrigieren, wenn es kein Problem mit höherer Priorität gibt) .

    
Pascal MARTIN 11.01.2010 23:15
quelle
2

SELECT * ist eine rote Flagge. Geben Sie eine Spaltenliste für die Abfrage an.

    
jl. 11.01.2010 23:27
quelle
1

Ich würde es zurückschicken und ich mag die Frage.

Die gesamte Überprüfung ist teilweise subjektiv. Die Kriterien sollten auf einer Reihe von Faktoren basieren.

  • Funktioniert es.

  • Erfüllt es angemessene Erwartungen hinsichtlich Leistung, Wartungsfreundlichkeit, Benutzerfreundlichkeit und Skalierbarkeit

Obwohl ich dieses spezielle Konstrukt noch nicht getestet habe - ich vermute, dass (wie Sie) dieser Code Ihrem SQL Server schreckliche Dinge zufügen wird. Damit werden Leistung und Skalierbarkeit in Frage gestellt.

    
Hogan 11.01.2010 23:13
quelle
1

Der Schreiber wollte eine Dummy-Anweisung, damit er / sie an alle nachfolgenden Anweisungen "and" anhängen kann. Ändern Sie es in eine bessere "no-op" -Anweisung wie 1 == 1 würde helfen. Oder sie könnten etwas mehr Arbeit machen und das "Wo" intelligent einfügen.

    
Jimmy 11.01.2010 23:16
quelle
1

Ich würde fragen, warum Bind-Variablen nicht verwendet werden (es sei denn, es gibt einen guten Grund in bestimmten Fällen):

%Vor%

Warum ist es nicht:

%Vor%     
Tony Andrews 23.03.2012 13:59
quelle

Tags und Links