2014-10-01 3 views
5

Мы религиозно используем cfqueryparam в наших SQL-запросах.Использование cfqueryparam с константами

Некоторые из моих предшественников, кажется, были слишком переусердными при использовании его с прямыми значениями, а не с переменными.

Не

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

излишеством? Я имею в виду, что нет возможности для SQL-инъекции, и я не думаю, что использование переменной привязки здесь делает что-то полезное для улучшения производительности в базе данных. Разве было бы не так целесообразно делать

record_is_deleted_bt = 0 

?

Есть ли какие-либо преимущества при использовании cfqueryparam в таком случае, помимо укоренения привычки его использовать? Есть ли недостаток?

+1

Ничего из этого я не знаю. Раньше я был одним из тех, кто переусердствовал, пока один из моих сотрудников не сказал мне, чтобы он подтянулся. –

ответ

4

Нет, это не перебор. Первое задание cfqueryparam - привязка данных. Это помогает в sql-инъекции, это просто дополнительный бонус. Готовые заявления через привязку данных выполняются быстрее. Вы ошибаетесь, полагая, что он может помочь только в предотвращении атаки sql.
Важное примечание: Я добавляю кейс, предоставленный @Dan Bracuk, на оракуле db.

<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#."> 

Общая сумма составляет от 700 до 900 общих миллисекунд. Без полного диапазона от 1800 до 4500 миллисекунд. Без общей суммы всегда будет по крайней мере вдвое больше.

+2

Не стесняйтесь утверждать, что использование параметров parmameters вместо констант улучшит производительность. –

+1

с cfqueryparam, план выполнения будет подготовлен, а с константой он не будет, JDBC будет передавать только всю строку запроса. Я считаю, что запрос с планом выполнения будет работать быстрее. –

+0

Мне хотелось бы что-то более твердое, чем «Я верю». –

Смежные вопросы