У меня есть приложение на основе Rails 4, которое обрабатывает некоторые работы стиля SIEM для нас. Я очень верю в то, чтобы сделать код максимально читаемым, а затем беспокоиться об оптимизации. Я обнаружил, что попытка найти все события, содержащие набор слов, приводит к исключительно низкой производительности, если я полагаюсь на AR, поэтому я прибегал к использованию SQL напрямую, даже если он хрупкий.ActiveRecord против SQL - Есть ли более чистый способ?
Есть ли лучший способ сделать следующее с помощью AR?
sql = "select event_id from events_words where generated>'#{starting_time.to_s(:db)}' and word_id in (select id from words where words.text in ('#{terms.join("', '")}')) group by event_id having count(distinct(word_id))=#{terms.count}"
events_words
является объединением таблица, содержащая word_id
для каждого слова в каждом случае, в event_id
для каждого события и generated
, метку времени, когда было сгенерировано событие. Сгенерированное поле используется для ограничения результатов поиска до временного интервала, а сама таблица разбивается по дате, чтобы поддерживать индексы в размере, который может поместиться в ОЗУ.
Спасибо, я опробовать присоединиться и посмотреть, как это работает для исполнения! –
@DavidHoelzer: Я надеюсь, что кто-то еще сможет вам помочь с повторной записью ActiveRecord. (Я действительно не помог ответить на заданный вами вопрос.) И, возможно, AR-запрос не будет таким ужасным, как я думаю, это будет так. (Я бы хотел поверить, что был бы элегантный способ выразить запрос, который вы хотите запустить, но у меня нет никаких доказательств, подтверждающих такое убеждение.) Используйте «EXPLAIN», чтобы увидеть план запроса. И убедитесь, что доступны подходящие индексы, например, «ON event_words (event_id, word_id, сгенерировано)» и «ON words (text, id)». – spencer7593