Можно ли передавать подсказки в базу данных? - PullRequest
2 голосов
/ 06 июня 2011

Используя rails 2.3.4, возможно ли передать подсказку оптимизатору базы данных?Я хотел бы иметь возможность принудительно использовать определенный индекс для целей тестирования.

У меня есть (устаревший код, да, он пахнет):

with_exclusive_scope {
  succeeded.average(:elapsed,
                    :conditions => ["date between ? and ? ", month_start, month_end],
                    :joins =>["LEFT OUTER JOIN update_phases proot on (updates.id=proot.update_id AND proot.phase_id=#{UpdatePhaseType.find_by_name("update").id} and proot.started_at between '#{month_start.to_s(:db)}' and '#{month_end.to_s(:db)}')",
                              "INNER JOIN profiles ON updates.profile_id = profiles.id and profiles.customer_instance_id=#{customer_instance.id}"],
                    :group =>'date', :order =>'date')
}

и хотел бы иметь возможностьчтобы привязать force index for join(profile_date_state_activity) к концу предложения FROM.

В противном случае мне нужен метод average_by_sql ...

1 Ответ

1 голос
/ 07 июня 2011

Вы можете использовать атрибут: from, чтобы изменить сгенерированный оператор SQL. Я не уверен, какое здесь имя вашей таблицы, поэтому в приведенном ниже фрагменте замените «table» на имя этой таблицы.

with_exclusive_scope {
  succeeded.average(:elapsed,
                    :from => "table force index for join(profile_date_state_activity)",
                    :conditions => ["date between ? and ? ", month_start, month_end],
                    :joins =>["LEFT OUTER JOIN update_phases proot on
                    etc.

К вашему сведению, в моей среде оператор SQL был сгенерирован правильно и успешно выполнен, возвращая ожидаемые данные, но у меня нет убедительных доказательств того, что подсказка фактически используется.

...