Coldfusion много циклов против запросов запросов - PullRequest
0 голосов
/ 02 марта 2011

Я удаляю записи входа в моей базе данных, у которых нет соответствующей записи выхода из системы, но сейчас она очень медленная. Это делает это:

Сначала он получает запросы, чтобы повторить цикл для проверки на удаление. Далееон должен выяснить, является ли следующая запись для этого пользователя логином или выходом из системы, если это логин, я его удаляю.

Чтобы получить следующую запись такого типа, он выполняет этот запрос:

<cfquery dbtype="query" name="getnext" maxrows="1">
SELECT * FROM getlogs WHERE id > #id# AND logType = 'login'
</cfquery>

Но это медленно, тысячи раз на это уходит около 56 секунд.

Что может быть быстрее для этого?Будет ли другой cfloop внутри моего цикла (в основном цикл, пока я не доберусь до нужной строки) быстрее?Есть ли другой способ?

Ответы [ 2 ]

6 голосов
/ 02 марта 2011

Это звучит как что-то, что может быть сделано целиком в одном запросе - возможно, что-то вроде этого:

delete from login_table t
where exists (
  select id
  from   login_table
  where  id > t.id
  and    logtype = 'login'
)

Это не имеет ничего общего с ColdFusion как таковым; такой же подход будет применяться в любой среде. Если это функция обслуживания, которая не имеет синхронной зависимости от вашего приложения, вы можете даже вставить ее в хранимую процедуру, автоматически вызываемую повторяющейся задачей «очистки» в самой базе данных.

0 голосов
/ 02 марта 2011

Лучше всего делать все это в SQL, используя курсоры или временную таблицу. Это позволяет сэкономить на обменах между серверами CF и SQL.

...