2014-10-01 12 views
5

Wir verwenden cfqueryparam in unseren SQL-Abfragen religiös.Verwenden von cfqueryparam mit Konstanten

Einige meiner Vorgänger scheinen etwas übereifrig zu sein, wenn man sie eher mit direkten Werten als mit Variablen verwendet.

Ist das nicht

record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0"> 

Overkill? Ich meine, es gibt keine Chance für SQL-Injection, und ich denke nicht, dass die Verwendung einer Bind-Variablen hier etwas hilfreich ist, um die Performance in der Datenbank zu verbessern. Wäre es nicht genauso vernünftig zu tun?

record_is_deleted_bt = 0 

?

Gibt es einen Vorteil der Verwendung von cfqueryparam in einem solchen Fall, neben der Gewohnheit, es zu verwenden? Gibt es einen Nachteil?

+1

Keine von denen mir bekannt ist. Ich war eines dieser übereifrigen Leute, bis einer meiner Kollegen mir sagte, ich solle mich schlau machen. –

Antwort

4

Nein, das ist nicht übertrieben. Der erste Job von cfqueryparam ist die Datenbindung. Es hilft bei der Vermeidung von sql-Injektionen ist nur der Zusatzbonus. Die vorbereiteten Anweisungen durch Datenbindung werden schneller ausgeführt. Sie sind der Meinung, dass es nur zur Verhinderung von SQL-Angriffen dient.
Wichtiger Hinweis: Ich bin Testfall von @Dan Bracuk auf einem Oracle DB hinzugefügt.

<cfquery name="without" datasource="burns"> 
select count(*) 
from burns_patient 
where patientid = 1 
</cfquery> 

<cfquery name="with" datasource="burns"> 
select count(*) 
from burns_patient 
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
</cfquery> 

<cfscript> 
TotalWithout = 0; 
TotalWith = 0; 
</cfscript> 

<cfloop from="1" to="1000" index="i" step="1"> 

    <cfquery name="without" datasource="burns" result="resultwithout"> 
    select count(*) 
    from burns_patient 
    where patientid = 1 
    </cfquery> 

    <cfquery name="with" datasource="burns" result="resultwith"> 
    select count(*) 
    from burns_patient 
    where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
    </cfquery> 

    <cfscript> 
    TotalWithout += resultwithout.executiontime; 
    TotalWith += resultwith.executiontime; 
    </cfscript> 

</cfloop> 

<cfdump var="With total is #TotalWith# and without total is #TotalWithout#."> 

Die mit insgesamt reicht von 700 bis 900 in Millisekunden. Der Gesamtwert liegt zwischen 1800 und 4500 Millisekunden. Der Gesamtwert ist immer mindestens doppelt so groß wie der Gesamtwert.

+2

Fühlen Sie sich frei, die Behauptung zu beweisen, dass die Verwendung von Abfrage-Paramametern anstelle von Konstanten die Leistung verbessert. –

+1

Mit cfqueryparam wird ein Ausführungsplan vorbereitet, während mit einer Konstante nicht, JDBC wird nur die gesamte Abfragezeichenfolge übergeben. Ich glaube, Abfrage mit einem Ausführungsplan wird schneller ausgeführt. –

+0

Ich hätte gerne etwas festeres als "Ich glaube". –

Verwandte Themen