Как <cfqueryparam> может повлиять на производительность для констант и нулевых значений?
Учтите следующее:
<cfquery name="aQuery" datasource="#aSource#">
SELECT aColumn
FROM aTable
WHERE bColumn = <cfqueryparam value="#aVariable#" cfsqltype="#aSqlType#" />
AND cColumn = 'someConstant'
AND dColumn is null
</cfquery>
Если я изменю
AND cColumn = 'someConstant'
в
AND cColumn = <cfqueryparam value="someConstant" cfsqltype="#aSqlType#" />
Есть ли потенциальное улучшение производительности? Есть ли потенциал для снижения производительности?
Что делать, если я делаю то же самое (используйте cfqueryparam) с AND dColumn is null
?
Мои выводы были неубедительными.
Если это важно, допустим ColdFusion9 и Oracle db 11g.
РЕДАКТИРОВАТЬ:
Я просто хотел бы повторить, что я спрашиваю о тегах cfqueryparam, которые используются конкретно с константами и / или нулевыми значениями, а также с улучшениями производительности, если таковые имеются.
3 ответа
Есть ли потенциальное улучшение производительности?
Нет. Переменные связывания наиболее полезны, когда используются различные параметры. Без них база данных будет генерировать новый план выполнения каждый раз, когда параметры запроса изменяются (что дорого). Переменные связывания побуждают базу данных кешировать и повторно использовать единый план выполнения, даже когда параметры меняются. Это экономит затраты на компиляцию, повышая производительность. Там нет никакой пользы с константами. Поскольку значение никогда не меняется, база данных всегда будет повторно использовать план выполнения. Так что нет особых причин использовать его для констант.
Есть ли потенциал для снижения производительности?
Я видел несколько упоминаний о специальных случаях, когда использование переменных связывания для констант может фактически снизить производительность. Но это действительно на индивидуальной основе.
Я так не думаю, так как у вас уже есть один <cfqueryparam>
и это превратит это в готовое заявление, но я не уверен.
Использование параметра запроса поможет двумя способами.
Во-первых, это защитит вас от SQLI. Это добавит уровень защиты, чтобы убедиться, что данные в параметре соответствуют ожидаемым.
Во-вторых, вы увидите увеличение производительности. Тем не менее, увеличение зависит от схемы данных и индексов. Параметр позволит базе данных кэшировать план запроса. Это ускоряет начальные накладные расходы на выполнение запроса. Чем сложнее запрос, тем важнее становится кэширование плана запроса.
Также убедитесь, что у вас есть покрывающие индексы для всех столбцов в предложении where и что они находятся в правильном порядке. Если нет, оптимизатор запросов может проигнорировать индексы и перейти непосредственно к сканированию таблиц.