CF - QoQ vs Query
У меня есть представление о том, что вызов запроса запросов выполняется быстрее, чем запрос из базы данных, потому что замедление в обмене данными между cf и db. Это правда.
Означает ли это, что QoQ в цикле является приемлемым, а запрос в цикле - нет.
5 ответов
Полные СУБД высоко оптимизированы для обработки [правильно написанных] запросов, и в современной сети издержки не будут огромными.
QoQ выполняются с использованием встроенной базы данных, которая может или не может быть хорошо оптимизирована, в зависимости от типа выполняемого запроса.
Таким образом, если база данных находится на другом компьютере в медленной сети, QoQ может быть менее медленным в некоторых ситуациях. Если вы обращаетесь к базе данных вообще, в идеале вы хотите, чтобы все обрабатывалось там соответствующим образом, в одном запросе, и избегало как циклических, так и повторных обработок в цикле.
Конечно, большое преимущество QoQ заключается в том, что вы можете использовать его для обработки данных, которые не поступают из базы данных, таких как результаты cfdirectory или CSV-файла, который был преобразован в запрос.
ColdFusion выполняет QoQ, анализируя SQL вручную, а затем просматривая набор записей. Это делает его эффективным для простых операций, таких как объединение в две таблицы с соответствующими ключами, но менее эффективным для сложных комбинаций (где объединение использует несколько столбцов и / или не является прямым сравнением a=b). ( Краткая информация здесь.)
Рейло использует H2. H2 утверждает, что он быстрый, и их веб-сайт предлагает некоторые сравнения скорости, которые предполагают, что он быстрее, чем Derby и MySQL - но, конечно, было бы лучше искать независимые сторонние тесты, не говоря уже о том, что эти тесты не являются гарантией QoQ производительность (которая, я подозреваю, не будет иметь индексов, например).
В общем: не принимайте никаких трудных решений, не выполнив сначала тестирование производительности, чтобы определить, что вам действительно нужно повысить производительность, и уметь объективно определить, какой метод на самом деле быстрее.
Это зависит от возможностей вашего компьютера Coldfusion по сравнению с вашим сервером базы данных и от проблемы, которую вы пытаетесь решить.
QofQ, как правило, будет очень быстрым для небольших наборов данных, потому что все это происходит в памяти вашего сервера. Однако если вы попытаетесь использовать QofQ для большого набора данных, на вашем сервере начнутся проблемы из-за накладных расходов, связанных с хранением и обработкой этих данных в памяти.
Запросы к базе данных обычно превосходят QofQ в больших наборах данных, потому что для этого они и предназначены. Базы данных хорошо обрабатывают большие объемы данных очень быстро. Используйте их для этого.
Если вы планируете извлечь большой набор результатов из базы данных и проанализировать его с помощью QofQ, это, вероятно, неправильный способ сделать это. Сделайте базу данных, чтобы уменьшить результаты для вас. Если вы часто запрашиваете у базы данных эту информацию, кэшируйте ее на своем сервере.
Имейте в виду, что все это субъективно и во многом будет зависеть от вашей конкретной проблемы, нагрузки, базы данных и возможностей сервера.
Я обнаружил, что использование a q OF q может быть НАМНОГО быстрее, чем получение БД из запроса.
Например, я неукоснительно использую QoQ в отчетах о продажах. У меня есть отчет о продажах, который будет составлен для диапазона дат 1-го квартала, в котором могут отображаться данные о продажах по агентам по продажам, а также могут отображаться показатели продаж по реализованным продуктам.
В моей БД для обоих разделов, которые будут отображаться в одном отчете, будут использоваться одни и те же таблицы / поля.
Я запрашиваю данные в основной таблице на основе диапазона дат, а затем запрашиваю эти результаты, чтобы построить каждый раздел моего отчета.
Я обнаружил, что этот метод был быстрее на обоих серверах с локальной и удаленной БД.
Время использовать QofQ
- Если у вас есть два источника данных и по разным причинам вы можете использовать связанные серверы
- Когда данные поступают через WDDX или JSON, и вы должны сделать соединение
- Когда целесообразно хранить данные в кэшированном запросе и выполнять QofQ против кэшированного запроса
- Когда вам нужно объединить результат directoryList() с базой данных
Раз не использовать QofQ
- Когда вы можете загрузить данные в структуру вместо
- При выполнении огромного количества итераций
- Когда один из исходных наборов данных очень большой
- Когда вам нужно сделать левое, правое или внешнее соединение
Для более подробной информации смотрите
http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html
Это для CF 9, но QofQ был примерно таким же, как CF 6